MEGAMAN 4 COMPREHENSIVE DOCUMENT version 1.6 - June 2016 Writers: Matrixz MartsINY (Looks best in monospaced font) -- Update notes -- Corrected sprite bank pointers for Sprite Bank 4 (6C010-7000F). Identified the usage of object IDs $39, $4B and $90. Additions by MartsINY (lots) 2016-06-02: Added informations on existing datas and documented more functions. More info on Subroutine $FD17 Added width and height values for Enemy hit detection data vs. other sprites (weapons/megaman) LEGEND : ======== RTS NUBT means the RTS of the ASM is Not Used By The following functions, so you can erase it. RTS UBT means the RTS of the ASM is Used By The following functions. So do not erase it unless you erase the following functions (or ASM) RTS PUBT means the same as UBT, but its RTS is used by the precedent function. RTS N means no RTS When the RTS are used by the next functions, I write where in the ASM code under. ============================ CONTENTS ============================= * NOTES * TERM DESCRIPTION * RAM (Memory Map) * ROM MAP (From start to end) * LEVEL BANK MAP * Object ID List * Sprite ID List * Unused ID's * Object - Vertical Wall Detection ID's (For D2FC/F0F8) * Object Slot Usage * Stage Bank / Scene Bank ID's * Scanline Effect ID's * Weapon ID's * Sprite Tile Usage * Primary Graphics Load ID's * Sound ID's (Music / Sound effect ID's) * ADDITIONAL MESSY NOTES: * Sprite Data Formats * Weapon Code Procedure * Explosion Code Procedure * Kill Enemy Procedure * ASM explanation : Bank $3C, $805E : Crushed by a moving wall? * Graphics Load Data * Earlier Version Traces * ROM Version / Regional differences * Object/Wall Hit Detection - Object Shape Data (Vertical Hit Detection) ============================== NOTES ============================== Offsets ------- Two types of offsets are used in this document; ROM offset and memory offset. Sometimes one of them are noted, sometimes both of them are noted, seperated with a slash. (Memory address to the left and ROM offset to the right). For those not familiar with memory offsets, if an offset in this doc is four-digit, its not a ROM offset, unless stated as so. The "rom offset" section is divided into sub-sections of one or more ROM banks, where the size of one ROM bank is $2000 bytes. "MEMORY AREA" is meant to tell what range in the NES' memory the ROM bank(s) are loaded into when it is being used. Level data ---------- For areas of level data, its noted as "". Level data is always placed at the same locations within a ROM bank. After the entire "ROM Offset" section of this document, there's a map describing how level data is organized withing all those banks. ========================= TERM DECRIPTION ========================= Object Slot ----------- Used to refer to a byte index in the object/sprite memory arrays. Enemy ID / Object ID / Sprite ID -------------------------------- All these three mean different things, and these are the terms i use to differ the three in this document. Now to try to explain the difference. Enemy ID -------- Identifies the different "enemies" or other objects that can be placed in a level, as part of level data. The Enemy ID is connected to several tables, such as HP, default speed, Sprite ID and Object ID. Object ID --------- Identifies the different AI's of enemies or other objects. Also, Megaman 4 has a complicated system of using different banks for sprite data. The bank it uses to read sprite data depends on the Object ID, using a lookup table at $7E00A in the ROM. Sprite ID --------- Identifies different sprite animations for the sprites on the screen. However, there are different banks used for sprite data, and these banks each have a set of Sprite ID's. Again, the sprite bank used depends on Object ID, and not Sprite ID. =============================== RAM =============================== List of Unused Memory ------------------------- ZP Zero use: 2C, 4F, 5F, 68, 70-7F, 98, AE, AF ZP Relatively free: 94 (Not used after RESET vector code.) Temporary Memory ---------------- 00-01 : Temporary - Used in all threads 02-13 : Temporary - Used only in Main thread 02-0F : Lower-level temporary 0F : Often use with function that return values results in Carry Flag. They make a ROR with it and then reuse $0F to know if the Carry was set or not. 10-13 : Subroutine argument / Subroutine result / Counters / Higher-level temporary These addresses are never used in NMI or IRQ. Joypad Memory ------------- 14 : Joypad 1 - Button Push Bits 15 : Joypad 2 - Button Push Bits [0 = Not Recently Pushed Down, 1 = Recently Pushed Down] 16 : Joypad 1 - Button Status Bits 17 : Joypad 2 - Button Status Bits [0 = Not Being Pressed Down, 1 = Being Pressed Down] MSB bit0 : A bit1 : B bit2 : Select bit3 : Start bit4 : Up bit5 : Down bit6 : Left bit7 : Right LSB Graphics Updates ---------------- 18 : Palette Buffer - Write Flag (if == 1, then write Palette Buffer to VRAM. $FF is also written.) 19 : VRAM Buffer - Write Flag (if > 0, then write VRAM Buffer to VRAM) 1A : VRAM Buffer - Write Flag (Vertical NameTable Updates) (if > 0, then write VRAM Buffer to VRAM, NameTable writes are done in Vertical direction. ) 1B : Auto Screen update - register 1C : Screen of Auto Screen update / Screen of Auto 32x32 Tile redraw If this is set to a value greater than 0 before entering weapon menu, it will draw the entire screen to the 2nd Nametable before gameplay resumes. 1D : Auto 32x32 Tile Draw. Value $80 or higher enables it. MSB bit0: Enable bit1: Destination Nametable of Draw 0 = $2000 1 = $2400/$2800 (depends on current mirroring) bit2-bit7: 32x32 Tile bit2-bit4: Vertical pointer bit5-bit7: Horizontal pointer LSB 1E : Enable special effect in Drill Man's Stage (???) -- 1F : Point in Level Passed 00 : Not passed any point 01 : Mid-Point 02 : Boss-Point (Or for some stages, secondary Mid-Point) This byte has more uses than this one. 20-21 : Screen Preset Data pointer 22 : Stage Bank / Scene Graphics Bank 23 : Direction which Nametable Column of Tiles has been recently drawn. 08 : Up 04 : Down 02 : Left 01 : Right 24 : Tile Nametable Row/Collumn Counter 25 : Pixel Scroll Counter X 26 : Pixel Scroll Counter Y 27 : Megaman's X position (Copy of 330) 28 : Current Screen Position Megaman is on. (Copy of 348) (Not current screen Scroll-wise. For Scroll-wise current screen, see Mem $F9). 29 : 32x32 Tile location on the screen. It is used in two different events: 1. Sprite hit detection with walls. The value is based on Mega Man or an enemy's position in a screen. 2. Name Table updates when scrolling. The value is based on the row / collumn being updated in a screen. The value is used in routine $D295 as a index into the level data. 2A : Next Screen Position (Scroll Related) / Screen of Nametable updates 2B : Scroll Direction + Scroll Data Index b0-3: Scroll Direction 08 = Up 04 = Down 02 = Horizontal b4-7: Current Scroll Map 2C : Never used in entire game. 2D : Number of Screens in Current Scroll Map. 2E : Current Screen Position of current Scroll Map (Scroll Related) 2F : Direction which Screen is being scrolled. 02 : Left 01 : Right Megaman stuff ------------- 30 : Status of Megaman 00 : On ground (Standing/Walking) OR IF STATUS WAS 01, BUT START WAS PUSHED, WHEN COMING BACK FROM PAUSE, STATUS WILL BE 00 EVEN IF IT SHOULD BE 00. OR MEGA MAN HIT A ROOFT. ALSO, IF ON GROUND WITH STATUS 06, 06 IS IN $30 THEN IT WILL BECOME 00. 01 : Jump 02 : Slide 03 : Ladder Climb 04 : Rush Marine 05 : Wire Adaptor use 06 : Hit by Object. 07 : Hit by spikes/Defeated by enemy/Fell down pit. When hit by spike, to know if #$07 will be set in $30, it checks $3D 08 : Boss Defeated - Warp Out 09 : Boss Chamber - Wait for Boss to get ready. 0A : "Ready" blink, Warp down. 0B : Boss Defeated - Weapon Get / Warp Out 0C : Battle with Cossack - Caught by Cossack Catcher 0D : Cossack Stage 4 - Cossack Defeated 0E : Cossack Stage 4 - Cossack Defeated (Dialog) 0F : Wily Stage 3 Rematch Room Warp 10 : Enter boss room - walk a bit forward (Used with Cockrach Twins boss) 11 : Wire/Balloon Item achieved - Wait, then warp out. 12 : Wily Stage 4 - Wily defeated. 13 : MM escapes from Wily's Fortress 31 : Walking Direction (Copied to memory $420) 32 : # of Frames which Megaman's Pose should last until it returns to normal. (Used for Weapon Aiming Poses, etc.) 33 : Indicated if MM is shooting : #$00 MM is not shooting. #$01 MM is shooting with gun (like normal weapon) #$02 MM is shooting with arm (like Metal Blade) 34 : Slide Counter 35 : Buster Charge Counter (If $35 = 5C, Full Charged Shot is ready) 36 : Buster Charge Palette set to set as megaman's palette when player releases B button. 37 : Megaman horizontal movement speed Low (ratio) (Written to $3A8) 38 : Megaman hotizontal movement speed High (pixels per frame) (Written to $3C0) 39 : Horizontal Movement Patch - Direction (Toad Man Wind and more) Values are as following : 00 : Mega Man is not moved. 01 : Mega Man is pushed to the right with values of 3A and 3B. 02 : Mega Man is pushed to the left with values of 3A and 3B. 3A : Horizontal Movement Patch - Speed Low (Toad Man Wind and more) 3B : Horizontal Movement Patch - Speed High (Toad Man Wind and more) 3C : Megaman's Invincibility Counter - Copied to $5B8 if > 0. $05B8 is what makes him blink. 3D : Set to #$30 when Megaman hits spikes. 3E : Ring Man stage / Ring Guy / Blocked passage flag Determines if Megaman has destroyed "Ring Guy" in Ring Man's stage where it traps the level passage until you have defeated it. Cleared at stage init. 3F : Hatch hit flag. Cleared at stage init. Written $50 to when megaman hits a hatch. This is used in the scrolling code to force scrolling right to the next section. Note: Contains TSA type value of any hit wall, (AND #$10 != #$00) But only to the right of Megaman. Seems to only be used for the purpose of checking for hit with hatches. -- 40-4E : Seems like temporary memory, but has many different uses. 40 : Object Hit Detection With Walls - Counter. 41 : 16x16 Tile Type of 16x16 Tile Object has hit. (Result of D2FC). If hit more than one 16x16 tile type, this will tell the Type with highest value. So don't use it to know if a solid tile was hit, because if water was hit (#$60) and a solid tile (#$10) it contains #$60. But in this case, $10 contains #$70. 42 : Object / Hit Detection temp? Copy of Object's Y Coordinate 43 : In water, fall slowly. It's a variable used to make sure Vertical Speed is lowered more slowly when in Water. It is set to #$03, and then until it reached #$00, Vertical Speed is not reduced. 44 : Seems to contain the hit block in center of MM. It is used to know when MM changes of of place (examole center touch air and middle touch water, then water will Splash 45-49 : Object Hit Detection with Walls - Result Array (From $45 to $49 they contain hit block from left to right I believe) Most object uses only 3 ($45 to $47 like Mega Man, but Jumbig uses them all) 45 : Temporary Store of 22 when executing weapon menu. 46 : Temporary Store of FC when executing weapon menu. Use at some other place, like before status $30 is set to "Ladder Climb". 47 : Temporary Store of 1C when executing weapon menu. 48 : Temporary Store of F0 when executing weapon menu. 49 : Temporary Store of FD when executing weapon menu. 4A : Temporary Store of FA when executing weapon menu. 4B-4E : Palette Animation ID - Temporary Store Used to store Palette Animation ID's from 6F0-6F3 when temporarily turned off (6F0-6F3 is cleared), to be turned back on by writing them back to 6F0-6F3. (Used by Weapon Menu) 4F : Never used in entire game. -- 50 : Graphics Load ID to load. 51 : Current byte position in Gfx load - Relative to offset 52/53 52-53 : Graphics being loaded - Address of ID 54 : Graphics being loaded- PRG-Bank to load graphics from 55 : Graphics being loaded - Remaining Tile Counter 56-57 : Graphics being loaded - Source Address Pointer 58-59 : Graphics being loaded - Dest. VRAM Address Pointer 5A-5B : Level Hit Detection : Temporary Address to Wall Hit Detect data 5C : # of Scanlines before Scanline Effect, from NMI. (Copy of $F1) 5D : ID : Mid-frame Scanline effect to do using MMC3 Scanline IRQ's. (Copy of $F0) 5E : Used with Scanline Effect #1 in Ring Man's Stage. 5F : Never used in entire game. -- 60 : Palette Animation Handler - Index Counter 61 : Palette Animation - Temp Mem - Copy of $18 status (Palette Buffer Write Flag) 62-63 : Palette Animation handler - Temp Mem - Address of Palette Animation data 64 : Palette Fade - Palette Ignore Bits. (Tells Palette Fade to ignore certain parts of the palette. Must be set before fade occurs. Cleared after fade.) MSB bit0: Ignore BG Palette 1 bit1: Ignore BG Palette 2 bit2: Ignore BG Palette 3 bit3: Ignore BG Palette 4 bit4: Ignore Spr Palette 1 bit5: Ignore Spr Palette 2 bit6: Ignore Spr Palette 3 bit7: Ignore Spr Palette 4 LSB 65 : Vertical Scrolling (Written to 2005, copy of FA) 66 : Horizontal Scrolling (Written to 2005, Copy of 69 or FC depending on Scanline IRQ Effect in use.) 67 : Source Nametable to Display - OR'ed with Memory $FF and written to $2000 every Vblank. Copy of FD normally, copy of 6A if Scanline IRQ Effects 3, 6, 7, 9, $A, or $B are used. 68 : Never used in entire game. 69 : Written to 66 if Scanline Effect ID is #3 6A : Written to 67 if Scanline Effect ID is #3 6B : If set (not 0), disable handling of sprite animations. Sprites are still rendered. Counter of Health/Weapon capsule increase amount. 6C-6F : Cossack Stage 4 end scene - Dialogue memory. 6C : Dialogue ID 6D : Character Pointer 6E-6F : Offset of Dialogue ID (THEY ARE WRITTEN BEFORE THE ARE READ, SO YOU CAN USE THEM AT OTHER PLACES, FOR TEMPORARY USE) -- 70-7F : Never used in entire game. Threads ------- 80-83: Thread 1 Register 80 : Thread 1 Status: 01: Has called back by $FF1C, waiting for Vblank. 02: Returned from NMI, returning from thread handler. 04: Vblank occured, execution to proceed. 08: Recently been registered. 81 : Thread 1 Frame Wait Counter 82 : Thread 1 Stack Pointer 84-87 : Thread 2 Register 86 : Thread 2 Stack Pointer 88-8B : Thread 3 Register (Not used) 8C-8F : Thread 4 Register (Not used) 90 : Thread handler memory 91 : Thread handler memory (thread counter?) / (Joypad update flag?) Denotes that Joypad is already updated and doesnt need 2nd update. 92 : Frame Counter - Increased in NMI. 93-94 : Thread Code Address for new thread to be registered. 93 : Also has a different use in thread handler routines 94 : Never used after boot-up (Last use is before copyright screen fades up.) -- 95 : Manual Frame Counter, not increased in NMI. 96 : Object Slot Counter - For Drawing Sprites 97 : Sprite DMA Buffer RAM - Free sprite 8-bit Pointer / Sprite Counter 98 : Never used in entire game. 99 : Global Gravity Force (Always $40.) 9A : VRAM update suspend flag. Used to synchronize sprite DMA updates and VRAM updates. 9B : Enable Scanline IRQ Effects? (Depending on value, write is done to $E000 / $E001) 9C-9D : Scanline IRQ Effect - ASM Address 9E : Stage Enemy Counter - Next Enemy (first to init by forwards movement) 9F : Stage Enemy Counter - Previous Enemy (first to init backwards movement) A0 : Item/Weapon In Use (Weapon ID) A1 : Extra Lives A2 : # of Energy Tanks A3-A8 : Slippery Block / A4 has another function A3 : It's used for Slippery Block. Contains direction bits of slipping direction A4 : If set, MM gets hit by spikes? Also in cossack Stage 1 set when MM is on slippery block (as long as he touches, even if a little, a slippery block, it contains #$B0. A5 : Slow Down This variable is always minimum #$01. Then, for every turn while walking in the same direction on ice, it is increase by #$01, up to #$1A Max. Then when deccelerating, it is diminished by #$01 every turn. this value is used to be substracted to $3A every turn when deccelerating A6 : This variable is like the high speed of A5 if A5 would be a low speed. But since max value of A5 it #$1A, it never happen. It was probably used when programming but was never used in the end. A7 : Used with "Slippery" block type. Horizontal Movement Patch for Slippery Block, set in $3A (Low) A8 : Used with "Slippery" block type. Horizontal Movement Patch for Slippery Block, set in $3B (High) A9 : Clear Bits for Regular Stages MSB bit0 : Skull Man bit1 : Dive Man bit2 : Dust Man bit3 : Ring Man bit4 : Pharaoh Man bit5 : Drill Man bit6 : Toad Man bit7 : Bright Man LSB AA : Clear Bits for Cossack / Wily Stages MSB bit0 : Wily 4 bit1 : Wily 3 bit2 : Wily 2 bit3 : Wily 1 bit4 : Cossack 4 bit5 : Cossack 3 bit6 : Cossack 2 bit7 : Cossack 1 LSB AB : Wily Stage 3 Warp Pointer. AC : Wily Stage 3 Rematch Warp Room - Robot Master Clear Bits. (Cleared at Stage Clear along with $100-$11F.) MSB bit0 : Dust Man (Lower-Right) bit1 : Ring Man (Right) bit2 : Pharaoh Man (Upper-Right) bit3 : Toad Man (Center-Right) bit4 : Dive Man (Center-Left) bit5 : Skull Man (Lower-Left) bit6 : Bright Man (Left) bit7 : Drill Man (Uppwer-Left) LSB AD : Suspend Megaman's Movement by # frames. (Used in Bright Man boss battle) AE-AF : Never used in entire game. -- B0 : Megaman's HP Weapon Energy - Array: B1 : Rush Coil B2 : Rush Jet B3 : Rush Marine B4 : Toad - Rain Flush B5 : Wire Adaptor B6 : Balloon Adaptor B7 : Dive - Dive Missile B8 : Ring - Ring Boomerang B9 : Drill - Drill Bomb BA : Dust - Dust Crusher BB : Pharaoh - Pharaoh Shot BC : Bright - Flash Stopper BD : Skull - Skull Barrier BE : Set to #$9C when opening weapon's menu. This is simply used to draw the energy bar below "M.Buster" (using the same method as for the other energy bars). The buster bar is always full in the weapon's menu ;) BF : Robot Master HP - This is a copy of $467 (or $466 in some cases) used to draw the Boss energy bar. Music / Sound ------------- C0 : Sound routines memory. C1-C7 : Sound routines memory C8 : BGM Tempo Low Counter C9-CA : BGM Tempo CB : BGM Transpose CC : BGM Fade Down / Up Speed (Set to Activate) CD : BGM Fade Depth CE-D0 : Sound routines memory CE : Sound's priority. Useful if in certain case you want a specific sound to crush another one. D1-D5 : Sound Effect stuff.. D6 : Sound routines memory - seems to be 00 most of the time.. D7 : Sound routines memory - also seems to be 00 mostly. D8 : Sound routines memory - same. D9 : Current Sound ID playing (Music) DA : Sound ID Init Array Counter (after init?) DB : Sound ID Init Array Counter DC-E3 : Sound ID Init Array E0 : Sound ID ------------- E4-E7 : Random Numbers E4 : Also written to outside random generator E6 : Also written to outside random generator E7 : Also written to outside random generator E6-E7 : Temp Values Used In Weapon Particle Hit Detection.. Also Temp Mem in Scrolling Nametable Updates. E8-E9 : NMI return address store/backup - used with stack manipulation in NMI. EA : If set (not zero) : Disable all writes to PPU registers and disable Scanline IRQ effects. EB : Object (ASM) Object Slot Counter EC : Copy (Backup) of $F6 ED : Backup of X Register (Used by $FF5C Routine.) EE : Backup of Y Register (Used by $FF5C Routine.) EF : Y Coordinate to give sprites below coordinate background priority. (00 = disable) See C86B. For every stage, this table is looked to set $EF F0 : Mid-frame Scanline effect# to do using MMC3 Scanline IRQ's. F1 : Scanline IRQ Effect - # of Scanlines before Start - Copied to 5C. F2 : Value which has been recently written to $8000 (MMC3 Control Register). F3 : Bank which has been switched into MMC3 Bank A ($8000 - $9FFF) - Copy of F5 at bankswitch. F4 : Bank which has been switched into MMC3 Bank B ($A000 - $BFFF) - Copy of F6 at bankswitch. F5 : Bank to Bankswitch to - MMC3 Bank A ($8000 - $9FFF) F6 : Bank to Bankswitch to - MMC3 Bank B ($A000 - $BFFF) F7 : Flag - Bankswitching in Progress? (If doing bankswitch, set to 1) Sound handling in NMI/Vblank is delayed to after bankswitch if this is set. (See below.) F8 : Flag - Handle sound immediately after next bankswitch. The sound handling done in NMI/Vblank sets the MMC3 bank registers directly, and needs F7 to be clear. If it isnt clear (bankswitch in progress), F8 will be set instead of handling sound at that moment. Then, when the NMI returns, the bankswitching routine will check F8 after fullfilling the bankswitch, and if set, branches to $FF5C which then calls the sound routines. In simplier words, it assures that sound is updated once every Vblank. :p F9 : Current Screen Position (Seems independent from Memory 28) FA : Vertical Scrolling - Copied to 65. FB : Set to 00 at Stage Start, other than that, dont know if its used. FC : Horizontal Scrolling - Copied to 66 and 25 (Some Scanline IRQ Effects causes 66 to be overwritten) FD : Source Nametable to Display - (Bits 6/7 of PPU Control Register 0) - Written to 67 but not used if specific Scanline IRQ Effects are active. 0 : Display Nametable at VRAM $2000 (Normal) 1 : Display Nametable at VRAM $2400 2 : Display Nametable at VRAM $2800 (Set to for Weapon Menu) 3 : Display Nametable at VRAM $2C00 FE : Written to $2001 (PPU Control Register 1) every Vblank. FF : AND'ed with #$78 and written to $2000 (PPU Control Register 0), then OR'ed with 67 and written to $200 again, both every Vblank. 100-11F : Stage - Pickup Item Bits [Ever noticed when Megaman dies and starts from a continue point, some picked up items like 'E' tanks doesnt exist anymore? This array sets bits to register these things. ] 120-123 : Rainbow bars memory : Draw register Is $80-$FF when a bar is active. If value is $C0-$FF, it will draw to the screen. bits 2 to 7 holds the screen position which the bar exists, but the value never seem used for anything. 124-127 : Rainbow bars memory : Nametable access address High 128-12B : Rainbow bars memory : Nametable access address Low 12C-12F : Rainbow bars memory : Index to TSA of level data, to draw to the screen. 130-132 : Energy Bar Enable. (If >$80, draw Energy Bar.) Memory Byte to use for Source is ($B0 + ([Value] AND $7F)) 130 : Megaman 131 : Weapon 132 : Boss 133-134 : Wait Counter? Used when MM achieves Wire Item Also used when Mega Man falls in a pit. They will be counted if $30 has the value 07, 08, 11 or 13. 135-137 : In-Gameplay Palette Fading registers. 135 : Init Register 136 : Frame Counter 137 : Current Value to Subtract from Palette 138 : Currently Selected Weapon/Item in Weapon Menu. Used to keep memory of cursor Values : 00 : Mega Buster 01 : Flash Stopper 02 : Rain Flush 03 : Drill Bomb 04 : Pharaoh Shot 05 : Ring Boomerang 06 : Dust Crusher 07 : E-Tank 08 : Dive Missile 09 : Skull Barrier 0A : Rush Coil 0B : Rush Marine 0C : Rush Jet 0D : Wire Adaptor 0E : Balloon Adaptor 139 : Weapon Menu - Previous selection. See values of $0138. Values are the same. 13A : Rain Flush Sprite Effect - Enable/Count Register 13B : Rain Flush Relative X Coordinate Register 13C : Flash Stopper Frame Counter Low 13D : Flash Stopper Frame Counter High 13E : (?) Has with rising/sinking water in Dive Man's stage to do. Also, Y Pixel where MM falls or gets out of water. Also used by Dust Man's moving ceiling. 13F : ?? Used by Dust Man's moving ceiling. 140-142 : ?? Used by Dust Man's moving ceiling. 140 : Shootable Block Hit - X screen on which the weapon met the block 141 : Shootable Block Hit - Copy of $29 at hit.. 142 : Shootable Block Hit - 16x16 Block index of 32x32 tile which is hit. (0-3) 143-144 : Counter until light turns back on automatically, after shooting lightbulb bot. 145 : Toad Man boss battle uses this. If >=$10, Rain Flush effect will use different sprite tile and palette. (Used when Toad Man casts rain flush, rather than Megaman.) 146 : Boss Object Slot index. 147 : ?? Copy of $22 when Warping back after achieving Wire Item. (Also copy of $22 when quitting gameplay loop.) Copied back to $22 when at Password Screen, in these cases: * After beating level. * Game Over. 148 : Cease MM Status Change (Mem $30) by set # of Frames. (i think) Setting $30 to #$11 along at least will make MM warp out of screen, but after this byte has been counted down to 0, decreased for every Vblank. (Used when Megaman picks up Balloon and Wire Items.) 149 : Used for Warps in Wily Stage 3. 14A-15F : Never used in entire game. (160 and a few bytes on may also be never used, it depends on how deep the stack from 17F grows.) Stacks: ------- <-17F : Third Stack (2nd Thread - Random Generator/Palette Animations) <-1BF : Secondary Stack (Main Thread - Main game loop) <-1FF : Main Stack (Thread Switch and Wait Handler) Sprite DMA Buffer RAM: ---------------------- 200-2FF : Sprite DMA Buffer RAM DATA FORMAT : Y POSITION - TILE TO SELECT - PALETTE TO SELECT - X POSITION PLEASE, NOTE THAT IF YOU DRAW TOO MUCH SPRITE ON A CERTAIN Y COORDINATE, SOME WON'T DISPLAY. THERE IS A MAXIMUM OF 8. Y POSITION is set to $F8 for sprites that are not used. --------------- Sprite/Object Arrays: --------------------- 300-317 : Object ID 318-32F : X Coordinate Ratio Counter 330-347 : X Coordinate 348-35F : X Screen (Level Screen) 360-377 : Y Coordinate Ratio Counter 378-38F : Y Coordinate 390-3A7 : Y Screen $00 : On visible screen. if $80-$FF : On screen above visible screen if $01-$7F : On screen below visible screen 3A8-3BF : Horizontal Speed Low 3C0-3D7 : Horizontal Speed High 3D8-3EF : Vertical Speed Low 3F0-407 : Vertical Speed High 408-41F : Substance and Shape Object's Byte: MSB bit0: Substance (If Set, MM is damaged if hitting Object) bit1: Weapon damage If 0, Weapons are deflected (however, if the weapon is set to do no damage for that object, nothing happens.) If 1, Object is damaged by weapons (however, if the weapon is set to do no damage for that object, the weapon is deflected if object is set to visible with bit 5 of Sprite Flag (of 528). If it is invisible, nothing happen.) bit2-bit7 : Shape ID (Decides Height and Width setting of occupying space). LSB Megaman's byte in this array ($408) has no use, appearently. 420-437 : Direction Bits Object's Byte: MSB bit4: Up (Not neccesarily set when Jumping) bit5: Down (Not neccesarily set when falling from gravity.) bit6: Left bit7: Right LSB 438-44F : Enemy Number# of Level 450-467 : Enemy HP 468-47F : Object ASM Private Memory 1 480-497 : Object ASM Private Memory 2 498-4AF : Object ASM Private Memory 3 4B0-4C7 : Object ASM Private Memory 4 4C8-4DF : Object ASM Private Memory 5 4E0-4F7 : Object ASM Private Memory 6 4F8-50F : Object ASM Private Memory 7 510-527 : Object ASM Private Memory 8 - Seems to only be used for Mothraya and Rainbow bars 438 : ???May never be used! Play a complete game with a debugger point to know. 468 : Backup of $30 when MM is hit by enemy. 480 : Used. Purpose unknown. 498 : Has to do with Mega Man being in air. For example, when Rush Coil makes Mega Man jumps, Rush Coil increase it by 1. 4B0 : Used with Rush Jet (Status if Megaman rides on Rush Jet?) 4C8 : Used with Pharaoh Shot (Object slot of loading Pharaoh Shot?) 4E0 : Flash Stopper Counter 4F8 : Used. Purpose unknown. 510 : Used to count energy depletion of Rush Marine 528-53F : Sprite Flags Object's Byte: MSB bit0: Game use it : set to 1 means enemy is on visible screen, 0 if he is not. For weapons, if set, it hurts enemies, else it doesn't bit1: Direction: 1=Face Right 0=Face Left bit2: 1=Sprite BG Priority 0=No Sprite BG Priority bit3: Apply X Scrolling when drawing sprites? (1=Yes. Probably always set.) bit4: If set, objects are not erased when moving out of screen. (Both Horizontally and Vertically) If object can hurt Mega Man, they can touch him, if they are in another screen. bit5: 1=Invisible 0=Visible bit6-7: Object Wall Bits (MM can walk on object) If value is 1, 2, 3, the Object have solids parts. If Mega Man hits a non solid parts, he ends up on top. Here are the solid parts. 1: Top 2: All 3: Top, Left, Right (if hit object by under, Mega Man is replaced at a certain position from the block (the right, left or top) LSB 540-557 : Sprite's Animation 558-56F : Sprite ID 570-587 : Animation Frame Counter 588-59F : ASM - Low Address 5A0-5B7 : ASM - High Address 5B8-5CF : Invincibility Blink / Freeze Action Status Object's Byte: MSB bit0: Mode (1 = Freeze Action, 0 = Invincibility Blink) bit1-bit7: Frame Counter of Blink/Freeze LSB Notes: The freeze function is used with Flash Stopper. Invincibility Blink refers to when Megaman or an enemy gets hit and become invincible for a moment, while blinking. This memory range is used for both cases. For Mega Man to be invincible, value must be in $3C. 5D0-5FF : Never used in entire game. --------------- 600-61F : Palette VRAM buffer 620-63F : Palette Source 640-67F : Attribute Table Work RAM 680-6BF : Stage Special Mem / 2nd Attribute Table Work RAM Memory is used by Ring Man's Rainbow bars. Drill Man "Switch" Memory: One byte for each Screen Position from $10 to $13: Values: $00 : Is Off $70 : Being Turned On (Fading up Palette) $7F : Is On Dust Man Shootable Block Memory: In the moving ceiling section from Screen Position $0C to $11: Every Block in this section has each a Bit for its status in the memory range $680-$691, the bit is set to 1 if the block is gone. The bits seems to be organized into each byte representing a field of shootable blocks of 32 pixels width and 64 pixels height. Mem is cleared when entering a new Scroll Map Position This memory range is also used to cache Attribute Table updates for the 2nd Name Table, at automatic screen drawing, triggered by memory $1B. This is done at the moving waves of Dive Man's stage, moving ceiling of Dust Man's stage, and possibly other places. 6C0-6C3 : Palette Animation ID - Temporary Store Used to store Palette Animation ID's from 6F0-6F3 when temporarily turned off (6F0-6F3 is cleared), to be turned back on by writing them back to 6F0-6F3. (Debug Menu) 6C0-6CF : 16x16 Tile Return Data (Used in Screen Drawing and Updating) Those indications are at least true when calling $D24B. Values may have different uses at different times. When that function is called, $29 must contain the Structure position to get datas for. There are 4 tiles in a TSA Block. 4 TSA Blocks in a Structure. 6C0-6CF contains the 16 Tiles of a Structure. Here is ASM code to read tile values from the buffer for a specific TSA Block and tile: First, load Y with the index of the TSA Block (values goes from 00 to 03). LDY #$00 Then, load X with a value from the table at $D2BA with Y as the index. This gives the correct pointer to $6C0 for your TSA Block. LDX $D2BA,Y Depending on which tile you want, you read from some address in $6C0 with X as the index. LDA $6C0,X ;Tile 00 LDA $6C1,X ;Tile 01 LDA $6C4,X ;Tile 02 LDA $6C5,X ;Tile 03 The contents in D2BA are as follows: Y = 00: TSA Block 00: 00 Y = 01: TSA Block 01: 02 Y = 02: TSA Block 02: 08 Y = 03: TSA Block 03: 0A 6D0-6EF : Never used in entire game. 6F0-6F3 : Palette Animation ID If bit 0 is on, palette is animated. 6F4-6F7 : Palette Animation Frame ID 6F8-6FB : Palette Animation Vblank Frame Counter 6FC-6FF : Never used in entire game. Sound: ------ 704-727 : Sound Effect Memory. 700-703 : Instrument 728-77F : BGM Memory 728-72B : Channel - ?? 72C-72F : Channel - ?? 730-733 : Channel - ?? (Has with CMD #4 to do) 734-737 : Channel - ?? (b0-1 : Duty Cycle, b2-7 : Volume?) 738-73B : Channel - ?? 73C-73F : Channel - Pitch Tune Setting 740-743 : Channel - Note Slide Setting 744-747 : Channel - Note (not used for Noise channel) 748-74B : Channel - Frequency - Low 74C-74F : Channel - Frequency - High (Noise frq. is stored here) 750-753 : Channel - Data Low Address 754-757 : Channel - Data High Address 758-75B : Channel - Octave 75C-75F : Channel - Transpose 760-763 : Channel - Note Length Counter 764-767 : Channel - Note-On Length Setting 768-76B : Channel - ?? 76C-76F : Channel - Loop Counter 0 770-773 : Channel - Loop Counter 1 774-777 : Channel - Loop Counter 2 778-77B : Channel - Loop Counter 3 77C-77F : Channel - ?? 780-7FE : VRAM Buffer. (Used to write to Name Table VRAM, either when screen is off or in NMI when screen is on.) Format: The buffer is divided in chunks of strings. If the first byte in the chunk is $80 or more (usually $FF), it means to stop reading chunks from the buffer. Format of string chunk: byte 0: PPU VRAM Address High (if >= $80, stop reading buffer) byte 1: PPU VRAM Address Low byte 2: Number of Letters/Bytes to write (minus 1; if the value is 0, it means to write 1 tile, if value is 1, it means to write 2 tiles, and so on..) From byte 3 follows the variable-length string of bytes to write in sequence, (length is the value of [Byte 2] + 1) This is the end of the string chunk. DEFINITION : If changing them affect the colors, here is how they works. Each of those byte will define a structure TSA blocks' palette use. First byte decide the structure at the given position, then the next byte is for the structure to the right... Bit are as follow : Bit 0-1 : Palette of TSA Block down right Bit 2-3 : Palette of TSA Block down left Bit 4-5 : Palette of TSA Block up right Bit 6-7 : Palette of TSA Block up left Format, explained by interpretion in C code style: { unsigned char a, x, y; unsigned char vram_hi, vram_lo; x = 0; loop: a = *(0x780 + x); if ((a & 0x80) == 0x80) { return (0); } vram_hi = a; a = *(0x781 + x); vram_lo = a; y = *(0x782 + x); for ( ; y >= 0; y--) { a = *(0x783 + x); NES_PPU_VRAM[(vram_hi << 8) | vram_lo] = a; x++; } x += 3; goto loop; } 780-78F : Password enter temp buffer. Copied to B0-BF if password is accepted. 7B0-7CF : Temporary Store of Palette while executing Weapon Menu. 7FF : Never used. ============================= ROM MAP ============================= 10 <-> 1400F - (Bank $0 <-> $9 by $2000) ---------------------------------------- CHR - Mostly Sprite Related, if not completely. 2010 <-> 400F - (Bank $1 by $2000) ---------------------------------- 2210-280F : Pharaoh Man 4010 <-> 600F - (Bank $2 by $2000) ---------------------------------- ROM offset 5A10-5B0F : Part of Pre-Intro Graphics (City Scene - Explosion Sprites.) 6010 <-> 800F - (Bank $3 by $2000) ---------------------------------- ROM offset 06410-0690F : Unused ROM offset 07210-0760F : Sprites loaded by boss containing graphics of Mega Man, they are loaded in Mega Man's PPU. ROM offset 07610-0770F : Sprites loaded by Pharaoh Man containing graphics of Mega Man, they are loaded in Mega Man's PPU. ROM offset 07710-0780F : Sprites loaded by boss containing graphics of Mega Man, they are loaded in Mega Man's PPU. ROM offset 07F10-07F8F : Spark Spine ROM offset 07F90-07FCF : Piranha part 1 ROM offset 07FD0-0801F : Unused Datas 8010 <-> A00F - (Bank $4 by $2000) ---------------------------------- ROM offset 8010-900F : Mega Man & Rush for Weapon Get ROM offset 9210-930F : Title screen tiles, cursor tile is used in Megaman 4, all sprites are used for Rockman 4 title screen. ROM offset 9410-950F : Actually never used. Not referenced to by any graphics load data. A010 <-> C00F - (Bank $5 by $2000) ---------------------------------- ROM offset A390-A3AF : Tiles for Block Platform (Enemy ID $80, Object ID $60) (used in Bright Man) C010 <-> E00F - (Bank $6 by $2000) ---------------------------------- ROM offset C310-C40F : Piranha part 2 ROM offset C610-C70F : Before Spikes Box, Unused Datas ROM offset C710-C80F : Spike Box ROM offset D010-D04F : Some block tiles, unused, but probably meant to be used in Drill Man's stage. ROM offset D310-D5EF : Mono-Roader ROM offset D5F0-D60F : After Mono-Roader, Unused Datas ROM offset D910-DB0F : Unused CHR :) E010 <-> 1000F - (Bank $7 by $2000) ----------------------------------- ROM offset E610-E66F : Skull Launcher ROM offset E670-E70F : After Skull Launcher, Unused Datas ROM offset E710-E80F : Wheeled Skull ROM offset EA10-EB0F : Unused CHR - Rolling ball (?) ROM offset EB10-EC0F : Unused CHR - Snake, and something. ROM offset EE10-EF0F : Fly (Enemy ID $13) Sprite graphics. 10010 <-> 1200F - (Bank $8 by $2000) ------------------------------------ 106C0-1070F : Unused CHR ? (Not sure.) 10710-107EF : Saturn Bot 107F0-107FF : After Saturn Bot, Unused Datas 11D10-11E0F : Unused CHR :) 11F10-1200F : Disappearing Block 12010 <-> 1400F - (Bank $9 by $2000) ------------------------------------ 12410-1270F : Unused CHR :) 12710-129AF : Mega Man's Head (the face on second intro screen) 12B10-1300F : Mega Man's Head (the face on third intro screen) 13110-1330F : Unused CHR :) 13810-13B0F : Unused CHR :) 14010 <-> 1800F - (Bank $A <-> $B by $2000) ------------------------------------------- [Sprite Bank 1 - Certian Enemies / Objects] MEMORY AREA: $8000-$BFFF 1616B-1780F : Unused random data. Tile Usage ID's: Coordinate ID's: 2E : Unused Coordinate Data A 43 : Unused Coordinate Data B 17810-17A0F : Tile Usage - Address Table Low 17A10-17C0F : Tile Usage - Address Table High 17C10-17D0F : Coordinate Data - Address Table Low NOTE! THE LAST POINTER IS #$41, SO ALL DATAS AFTER 17C4F WOULD BE USABLE! TO CHECK 17D10-17E0F : Coordinate Data - Address Table High NOTE! THE LAST POINTER IS #$41, SO ALL DATAS AFTER 17D4F WOULD BE USABLE! TO CHECK 17E10-17F0F : Animation - Address Table Low 17F10-1800F : Animation - Address Table High Adjust Value : C010 18010 <-> 1C00F - (Bank $C <-> $D by $2000) ------------------------------------------- [Sprite Bank 2 (Megaman, etc.)] MEMORY AREA: $8000-$BFFF 1807C-1808F : Tile Usage - Megaman Walk (1 animation) 180B8-180F3 : Tile Usage - Megaman Stands Still 18120-18165 : Tile Usage - Megaman Jumps 181A8-181BF : Tile Usage - Megaman leashes out item 1827E-182B3 : Tile Usage(s): ?? 1868A-186E1 : Tile Usages - Balloon Item 186E2-18733 : Tile Usage - Dive Missile 18786-18789 : Tile Usage - Smal Pharaoh Shot 187C6-187CF : Tile Usage - Medium Pharaoh Shot 187DA-187ED : Tile Usage - Big Pharaoh Shot (Animation 1) 187EE-18801 : Tile Usage - Big Pharaoh Shot (Animation 2) 18FD6-18FE9 : Tile Usage - Wire Item Capsule 8FDA-8FED / 18FEA-18FFD : Tile Usage - Balloon Item Capsule 18FFE-1909F : Tile Usage - Wily saucer flying away 1974A-19771 : Coordinate - Megaman 197CE-197DD : Coordinate - Megaman 197EE-19811 : Coordinate - Megaman Facing Left 1994C-19961 : Coordinate - Megaman leashing out item 199F4-19A05 : Coordinate - Common 16x16 Sprite? 19C50-19C65 : Coordinate - Balloon Item 1A35E-1A3BF : Coordinate - Wily saucer flying away 1A6DA-1A6E6 : Animation - Megaman (Standing) 1A74C-1A752 : Animation - Unused 1 1A767-1A769 : Animation - Unused 1A818 : Times for "Ready" to blink before MM warps in. (Default = $19) (Changing it doesnt work. I dont know why.) 1A819 : "Ready" Blink Delay 1A85F-1A866 : Animation datas - Balloon Item 1A86F-1A87A : Animation - Dive Missile 1A888-1A891 : Animation datas - Pharaoh Shot A8B0-A8B3 / 1A8C0-1A8C3 : Animation - Wire Item Capsule A8B4-A8B7 / 1A8C4-1A8C7 : Animation - Balloon Item Capsule 1A9B6-1A9C5 : Animation - Wily Saucer flying away 1AA7D-1B80F : Unused space with random data. 1B810-1B987 : Tile Usage - Address Table Low 1BA10-1BB87 : Tile Usage - Address Table High 1BC10-1BD0F : Coordinate Data - Address Table Low 1BD10-1BE0F : Coordinate Data - Address Table High 1BE10-1BEBF : Animation - Address Table Low 1BF10-1BFBF : Animation - Address Table High Adjust Value : 10010 Tile Usage: 21-2B : Unused. 40-42 : Unused. 48 : Unused. 51-54 : Unused. 57 : Unused. 62-65 : Balloon Item 92-99 : Unused. EB-EC : Wire Item Capsule ED-EE : Balloon Item Capsule 101-108 : Wily saucer flying away Coordinate ID's: 20 : Medium Pharaoh Shot, Shooted left 21 : Medium Pharaoh Shot, Shooted right 22 : Small Pharaoh Shot, Shooted left 23 : Small Pharaoh Shot, Shooted right 24 : Big Pharaoh Shot Left 25 : Big Pharaoh Shot Right 41 : Balloon Item Left 42 : Balloon Item Right 97-9D : Wily saucer flying away 1C010 <-> 2000F - (Bank $E <-> $F by $2000) ------------------------------------------------ [Sprite Bank 3 - Boss, and certain other things.] 1F810-1FA0F : Tile Usage - Address Table Low 1FA10-1FC0F : Tile Usage - Address Table High 1FC10-1FD0F : Coordinate Data - Address Table Low 1FD10-1FE0F : Coordinate Data - Address Table High 1FE10-1FF0F : Animation - Address Table Low 1FF10-2000F : Animation - Address Table High Adjust Value : 14010 20010 <-> 3600F - (Bank $10 <-> $1A by $2000) --------------------------------------------- CHR - Stage / Cutscene Backgrounds. 2A010 <-> 2C00F - (Bank $15 by $2000) --------------------------------------- 2BD10-2C00F : This CHR is unused :) 36010 <-> 3800F - (Bank $1B by $2000) ------------------------------------- [Intro Sequence / Ending / Credits - Code & Data] 8000 : Entry Point - Pre-Intro 8003-> : Ending/Credits programming 8458 : In middle of Credits programming 8875 -> : Background Palettes! 88F5 / 36905 : Intro 0 8915 / 36925 : Intro 1 8935 / 36945 : Intro 2 8955 / 36965 : Intro 3 89B5 / 369C5 : ?? 369E5 : ?? 36A05 : ?? 36A25 : ?? 36A45 : ?? 36A65 : ?? 36A85 : Epilogue? 36AA5 : ?? 8E36-> : ASM - Pre-Intro 9AD4-9FFF : 38010 <-> 3A00F - (Bank $1C by $2000) ------------------------------------- CHR - Some sprite CHR, some intro sequence CHR. 38CB0-3900F : Before Mega Man's Body Graphics Datas of fourth intro screen 39010-394BF : Mega Man's Body Graphics Datas of fourth intro screen 394C0-39FDF : Mega Man's Head Graphics Datas of fourth intro screen 3A010 <-> 3C00F - (Bank $1D by $2000) ------------------------------------- [Sound Data Bank #2] 3B9D2-3C00F : Not used. 3B9D2-3BA70: Shadow of 3B933-3B9D1, probably from earlier version of game. Nothing new. 3BA71-3BFFF: Shadow of Sprite Data Pointers from earlier version of game? (which were moved to different bank?) 3C010 <-> 3E00F - (Bank $1E by $2000) ------------------------------------- [Sound Data Bank #0] ASM: 8000: Entry Point - Frame Playback 8003: Entry Point - Sound ID Init (Sound ID in A) 3E010 <-> 4000F - (Bank $1F by $2000) ------------------------------------- [Sound Data Bank #1] 40010 <-> 4200F - (Bank $20 by $2000) ------------------------------------- [Bright Man Stage Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Bright Man B700-B7FF : Mega Buster: Damage to each object ID B800-B8C6 : Palette Animation Handler ASM B813-B822 : Check for each palette if it's animated. If so, call $B829. If #$80 (bit 7 is on), palette is animated. B829-B862 : Subroutine called if palette is animated. B8C7-> : Palette Animations - Palette Sets - (Groups of 3 bytes) D3 is last Palette Set BB43-BD2B : Palette Animation Data BD2C-BD6B : Palette Animation ID Offset - Low Byte BD6C-BDAB : Palette Animation ID Offset - High Byte 41DBD-4200F : Unused random data. 42010 <-> 4400F - (Bank $21 by $2000) ------------------------------------- [Toad Man Stage Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Toad Man B700-B7FF : Rush Coil : Damage to each object ID (Should be same as Mega Buster) B800-BFFF : Unused random data. 44010 <-> 4600F - (Bank $22 by $2000) ------------------------------------- [Drill Man Stage Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Drill Man B700-B7FF : Rush Jet : Damage to each object ID (Should be same as Mega Buster) B800-BFFF / 45810-4600F: Graphics (Wily Stage 2) 46010 <-> 4800F - (Bank $23 by $2000) ------------------------------------- [Pharaoh Man Stage Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Pharaoh Man B5E0-B6FF : Unused. B700-B7FF : Rush Marine : Damage to each object ID (Should be same as Mega Buster) B800-BFFF / 47810-4800F : Dr.Wily Stage 2 Boss Tiles 48010 <-> 4A00F - (Bank $24 by $2000) ------------------------------------- [Ring Man Stage Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Ring Man B700-B7FF / 49710-4980F: Rain Flush: Damage/Effect to each Object ID B800-BFFF / 49810-4A00F: Unused tile table: Japanese characters and other characters. 4A010 <-> 4C00F - (Bank $25 by $2000) ------------------------------------- [Dust Man Stage Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Dust Man B700-B7FF / 4B710-4B80F : Wire Adaptor : Damage to each Object ID A800-BFFF / 4B810-4C00F: Ending Scene (Train Ride) Tiles 4C010 <-> 4E00F - (Bank $26 by $2000) ------------------------------------- [Dive Man Stage Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Dive Man B700-B7FF : Balloon Adaptor : Damage to each Object ID (All zero. Not used at all!) NOTE: IF YOU WANT COLLISION TO BE CHECKED BETWEEN BALLONG AND ENEMIES, CHANGE THE VALUE OF $FABE FOR THE BALLOON ADAPTOR ITEM. A800-BFFF / 4D810-4E00F: Wily Stage 4 BG Tiles 4E010 <-> 5000F (Bank $27 by $2000) ----------------------------------- [Skull Man Stage Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Skull Man B700-B7FF / 4F710-4F80F : Dive Missile : Damage to each Object ID B800-BFFF / 4F810-5000F : Empty, unused space. 50010 <-> 5200F (Bank $28 by $2000) ----------------------------------- [Cossack Stage 1 Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Cossack Stage 1 B700-B7FF / 51710-5180F : Ring Boomerang : Damage to each Object ID [Primary Graphics Load Data] 51810-5187F : Offset - Low Byte 51880-518EF : Offset - High Byte 518F0-51DD1 : Primary Graphics Load - Data 51DD2-5200F : Filler Junk (Usable for expanded Primay Graphics Load Data) 52010 <-> 5400F (Bank $29 by $2000) ----------------------------------- [Cossack Stage 2 Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Cossack Stage 2 B700-B7FF / 53710-5380F : Drill Bomb : Damage to each Object ID [Scroll Graphics Load Data] B800-B84F / 53810-5385F : Scroll Gfx Load - Offset - Low Byte B860-B8AF / 53870-538BF : Scroll Gfx Load - Offset - High Byte B8B0-> / 538C0-> : Scroll Gfx Load - Data 53BF1-53BF4 : Palette for Pharaoh Man (P1) BODY 53BF5-53BF8 : Palette for Pharaoh Man (P2) JEWEL 53BBA-53BBD : Palette for Dust Man (P1) VACCUM 53BBE-53BC1 : Palette for Dust Man (P2) BODY 54010 <-> 5600F - (Bank $2A by $2000) ------------------------------------- [Cossack Stage 3 Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Cossack Stage 3 B700-B7FF / 55710-5580F : Dust Crusher : Damage to each Object ID B800-BFFF / 55810-5600F : Intro Sequence Graphics (City) 56010 <-> 5800F - (Bank $2B by $2000) ------------------------------------- [Cossack Stage 4 Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Cossack Stage 4 B700-B7FF / 57710-5780F : Pharaoh Shot : Damage to each Object ID B800-BFFF / 57810-5800F: Intro Sequence Graphics (Megaman is born) 58010 <-> 5A00F - (Bank $2C by $2000) ------------------------------------- [Wily Stage 1 Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Wily Stage 1 B700-B7FF / 59710-5980F : Flash Stopper : Property/effect to each Object ID B800-BFFF / 59810-5A00F: Intro Sequence Graphics (Train Ride) 5A010 <-> 5C00F - (Bank $2D by $2000) ------------------------------------- [Wily Stage 2 Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Wily Stage 2 B700-B7FF / 5B710-5B80F : Skull Barrier : Damage/effect to each Object ID If Value is $FF, it will remove the enemy Object instantly. (Such as bullets.) B800-BFFF / 5B810-5C00F : Empty, unused space. 5C010 <-> 5E00F - (Bank $2E by $2000) ------------------------------------- [Wily Stage 3 Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Wily Stage 3 B700-B7FF : Unused. (Random data) B800-BFFF / 5D810-5E00F: Ending Scene Graphics (Snowy Hill) 5E010 <-> 6000F - (Bank $2F by $2000) ------------------------------------- [Wily Stage 4 Data] MEMORY AREA: $A000-$BFFF A000-B6FF : : Wily Stage 4 B700-B7FF : Unused. (Copy of Snowy Hill Graphics) B800-BFFF / 5F810-6000F : Ending Scene Graphics (Train Ride BG - other half) 60010 <-> 6200F - (Bank $30 by $2000) ------------------------------------- [Stage Select / Capcom Logo / Stage Intro / Weapon Menu / Copyright Text - Tile Assemy and Screen Data] MEMORY AREA: $A000-$BFFF A000-A3FF : 16x16 Tile - 8x8 Tile Assembly Data A400-A4FF : 16x16 Tile - Palette and Substance Data A500-A8FF : 32x32 Tile - 16x16 Tile Assembly Data A900-B0FF : Screen Preset - 32x32 Tile Assembly Data (Space for $20 Screen Presets) AB00-B0FF : Unused. B100-B2FF : Unused random data? B500-B505 : Screen Preset Layout. This is used. B530-B531 : Stage Layout (Not used) B550-B551 : Stage Part : Stage BG Palette Set (Not used) B560-B561 : Stage Part : Scroll Graphics Load ID (not used) Note : The Copyright screen, as well as parts of the intro, load Primary Scroll GFX #$55. You can change this value at 36E5F B590-B5A3 : Copy of Rockman 4 title screen palette set. Never used. (From B300 to B7FF there seems to be just junky expect for the above data.) B800-BFFF / 61810-6200F : Wily Stage 3 Graphics 62010 <-> 6400F - (Bank $31 by $2000) ------------------------------------- [Weapn Get / Password / Title Screen - Tile Assemy and Screen Data] MEMORY AREA: $A000-$BFFF AA00-90FF : Unused. B100-B7FF : Copy of Wily Stage 3 Graphics, bank's stage data layered above. (The real tiles are elsewhere.) B590-B5A3 : Some palette set. Never used. B800-BFFF / 63810-6400F : Blank Tiles. However, this is loaded at the bottom half portion of BG Tiles for Wily Stage 3. 64010 <-> 6600F - (Bank $32 by $2000) ------------------------------------- [Cossack Stage Map / Wily Saucer Scene / Wily Stage Map - Tile Assemy and Screen Data] MEMORY AREA: $A000-$BFFF AA00-B0FF : Unused. B590-B5A3 : Black palette set. Never used. B800-BFFF / 65810-6600F : Wily Stage 3 Wily Battle BG Graphics 66010 <-> 6800F - (Bank $33 by $2000) ------------------------------------- [Intro Scene - Tile Assemy and Screen Data] MEMORY AREA: $A000-$BFFF B590-B5A3 : A unused copy of Bright Man Stage's 1st Palette Set resides here, for whatever reason. :) B5A4-B7FF : Unused data. B800-BFFF / 67810-6800F: Wily Stage 3 Wily Battle BG Graphics (for second form?) 68010 <-> 6A00F - (Bank $34 by $2000) ------------------------------------- [Ending Scene - Tile Assemy and Screen Data] MEMORY AREA: $A000-$BFFF B590-B5A3 : Another unused copy of Bright Man Stage's 1st Palette Set resides here, for whatever reason. :) B700-BFFF : Unused random data. 6A010 <-> 6C00F (Bank $35 by $2000) ----------------------------------- [Object ASM Bank #1] MEMORY AREA: $A000-$BFFF A000-A02C : Cossack Defeated Scene - Dr.Wily - Object ASM (Oject ID $A5) A02D-A33F : Wily Stage 1 Boss - eyes - Object ASM (Object ID $A6) A340-A429 : (Tables, probably used by Wily Stage 1 Boss) A42A-A486 : Object ASM - Wily Stage 1 Boss - Metools (Object ID $AA) A487- A797-> : Warp Object ASM (Object ID $B3) A7F9 : Boss Init Object ASM A862 / 6A872 : Sound effect ID to play when boss charges energy A89F / 6A8AF : Load stage ID in Y. If it's a castle stage, load in Y $AB (Wily Stage 3 Warp pointer. Uses table A8D4 A8AC-A8B3 / 6A8BC-6A8C3 : Boss Sprite ID to set at beginning of boss battle, for each stage. A8B4-A8BB / 6A8C4-6A8CB : Robot Master enters chamber - Vertical Floor Hit Detection ID A8BC / 6A8CC : Contains the Object ID of the boss, indexed by the Stage ID A8C4 / 6A8D4 : Contains the Sprite ID of the boss, indexed by the stage ID A8CC / 6A8DC : Contains the S&S pointer of the boss, indexed by the stage ID A8D4 / 6A8E4 : A table used by A89F if in a castle stage (??? don't know more) A8DE / 6A8EE : Contains the starting horizontal speed low of the boss, indexed by the stage ID A8E6 / 6A8F6 : Contains the starting horizontal speed high of the boss, indexed by the stage ID A8EE : Object ASM (unknown) A971-A9B5 : Cossack Defeated Scene - Kalinka - Object ASM (Oject ID $A3) A9B6-AA51 : Cossack Defeated Scene - Protoman - Object ASM (Object ID $A4) AA52-AC12 : Wily Stage 3 Battle (Object ID $BC) ABA6-AC12 : Subroutine called from ADD6 AC13-AC40 : Wily Stage 3 Battle - Shots - Object ASM (Object ID $BF) AC41-ADD5 : Object ID $C0 ASM (Wily Stage 3 Battle something) ADD6-AE7B : Object ASM - Handler when Wily battle finished in Wily Stage 3. (Object ID $27) ADD6 : Main Entry Point AE16 : 2nd Entry Point AE4F : 3rd Entry Point AE61 : 4th Entry Point AE7C-AEDB : Subroutine - Set explosions and mute sound when boss dies. Called by ADD6 Called by B2EB AE81 : Called as sub by B29E AF94-AFD3 : Data used by AE7C. AFD4 : Object ASM executed when boss dies. B0F0 : Jumped to from ASM in B0F4 B0F4-B17B : ObjASM of Object ID $4D and Object ID $2A B188-> : Table B213-> : Table B29E-B2EA : Object ASM - Cossack stage 3 boss - Handler - Initialize 2nd Cockroach Twin (Object ID $49) B2EB-B32B : Object ASM - Cossack stage 3 boss - Handler - Cockroach twins defeated (Object ID $4A) B2EB : Main Entry Point B2FD : 2nd Entry Point B313 : 3rd Entry Point B3FD : "Shuffled Blocks" Object ASM. (Object ID $C3) B423 : Alternate entry point B480-B4C2 / 6B490-6B4D2 : Cossack Stage 3 Boss - Nametable writes - VRAM buffer source. B4C3-B4C4 : Screen: Block data byte pointer into B4C5 B4C5-B4EA : Block data. B4EB-B614 : Wily Stage 4 Battle ASM (Object ID $C4) B615-B696 : Wily Stage 4 battle - Charged Shot ASM (Object ID $C5) B934-BFFF : Unused random data. 6C010 <-> 7000F - (Bank $36 <-> $37 by $2000) --------------------------------------------- [Sprite Bank 4 (Many enemies, pickups, and more.)] MEMORY AREA: $8000-$BFFF 8ACC-6ADF / 6CADC-6CAEF : Tile Usage: E-Tank 6DD0C : Coordinate: E-Tank AND Ring Man Rainbow Bars. 6F18E-6F191 : Animation - Smal Life Energy. 6F19D-6F1A0 : Animation - E-Tank 6F1C5-6F1C9 : Animation -Ring Man Rainbow Bars. B4EA-B7FF / 6F4FA-6F80F : Unused space. (random bytes) 6F810-????? : Tile Usage - Address Table Low 6FA10-????? : Tile Usage - Address Table High 6FC10 : Coordinate Data - Address Table Low 6FD10 : Coordinate Data - Address Table High 6FE10-????? : Animation - Address Table Low 6FF10-????? : Animation - Address Table High Adjust Value : 64010 Tile Usage ID's: AB : E-Tank (Anim 1) AC : E-Tank (Anim 2) Coordinate ID's: 2F : Smal Energy Capsule 70010 <-> 7200F (Bank $38 by $2000) ----------------------------------- [Object ASM Bank #2 (Boss ASM) / Enemy init handle Bank] Note: This bank can be loaded into either memory range $8000-$9FFF and $A000-$BFFF, depending on what it is being used for. MEMORY AREA: $8000-$9FFF 8000 : Entry Point from Game Loop - Check for Enemies to Init. 810B : Read stage Enemy data, Set up Object and Sprite registers. 817F-820E / 7018F-7021E : 528() flags to set for each Enemy ID 820F-829E / 7021F-702AE : Object ID to put for stages enemies and items, indexed by Enemy ID 829F-832E / 702AF-7033E : 408() flags to set for each Enemy ID (Substance and Shape) 832F-83BE / 7033F-703CE : Sprite ID to put for stages enemies and items, indexed by Enemy ID 83BF-844E / 703CF-7045E : Enemy HP for each Enemy ID 844F-84DE / 7045F-> : Initial speed setting for each Enemy ID. Value is an index two other tables telling the real speed low and highs. (84DF and 84E6) 84DF-84E5 : Object Speed Setting - Low 84E6-84EC : Object Speed Setting - High 84ED-851C : Effect Sprite - 4-Color Quad Palette Index Byte 851D-854C : Effect Sprite - Palette Anim ID or 4-color Palette (if >= $80, its a Palette Animation ID, else its a 4-byte block index into 854D. 854D-85A8 : Effect Sprite - Palette Sets (4 bytes for each set, Omni-BG Color + 3 colors to load into chosen 4-Color quad.) 85A9-87FF : Unused random data. MEMORY AREA: $A000-$BFFF [Skull Man's ASM: A800-AA69] [Ring Man's ASM: AA6A-AD27] Object Memory: $468,X (Private mem 1) : Status 1E: Walk? AA6A : First Entry Point. Datas: AAB6 / 70AC6 : Delay before next movement - after shooting first Ring Boomerang. ABEC-AC06 : Subroutine - Check if there's two Ring Boomerangs in air. AC6C-AD27 : Ring Man's Ring Boomerang ASM (Object ID $76) [Dust Man's ASM] AD28-AE41 (for the end, there may be a table after, but it's the end of the AI) AD28 : Main Entry Point. ADD6 : Entry Point [Drill Man's ASM: B045-B32F] B2E2 : Object ASM (Object ID $82) [Bright Man's ASM] B541 : Main Entry Point? (Wait for delay) B58E : Entry Point - Mode 2 B5DA : Entry Point - Bright Man Shoots. B5F6 : Continue Point - Bright Man Shoots. 716D8 : Bright Man Modes 35 : Jump 37 : Flash with Lightbulb 38 : Shoot [Pharaoh Man's ASM: B330-B53B / 71340-7154B] B330-B4FD / 71340-7150D Pharaoh Man ASM first entry point B387 Charging Pharaoh Shot entry point B33A Load next AI from Y (going from 00 to 02) entry point B3C9 Jump on Mega Man entry point B3F8 Manage the jumps once parameters are set (note: big jump parameters are set at $B3C9, but the two small jumps parameters are set when setting the new AI at $B33A. This just execute a jump with the given parameters). B4FE-B52A / 7150E-7153A Pharaoh Man's table (in function of a value from a AI pointer, AI pointer, depending on what to do, is a value from 00 to 02, when we load an ASM with this pointer, we load all those datas.) B516-B518 / 71526-71528 : Sprite ID B519-B51B / 71529-7152B : Low ASM B51C-B51E / 7152C-7152E : High ASM B51F-B521 / 7152F-71531 : Vertical Speed Low B522-B524 / 71532-71534 : Vertical Speed High B525-B527 / 71535-71537 : Counter until the Small Pharaoh Shot is thrown when in air B528-B52A / 71538-7153A : Number of jumps to do B52B-B52D / 7153B-7153D Pharaoh Shot ASM B52E-B53B / 7153E-7154B Normal Shot ASM [Common Boss ASM] B71E-B743 : Return a Y used to pick in a table the next action. Start from Y 0, until y = probably?? max value from action table. To give a randomize feeling, actions are in a table [Toad Man's ASM] B747 : Toad Man's ASM Start B7DA : Other Entry Point BB9B-BBF3 / 71BAB-71C03 : Seemingly unused ASM.. hmm. [Cockroach Twins] BC71 : Subroutine - Draw Hatch opening up BCDA : Subroutine - Draw Hatch closing BD43-BD4D / 71D53 : Cockroach Twins : Hatch Open/Close Buffer Template BD4E : Cockroach Twins : Hatch tile preset pointer BD56-BD61 : Cockroach Twins : Hatch tile presets BD62-BFFF : Unused random data. 72010 <-> 7400F (Bank $39 by $2000) ----------------------------------- MEMORY AREA: $8000-$9FFF [Sequence] 8000 : Entry Point - Startup ($800C) 8003 : Entry Point - Handle Return from Stage Clear / Game Over ($8C7C) 8006 : Entry Point - Level Init ($85AD) 8009 : Entry Point - Debug Menu!!! ($9A28) 800C-> : Startup ASM 8022 : Execute Point - Copyright Screen Wait [Title Screen] 803A : Execute Point - Entering Title Screen 804D-8051 : Check if a menu was selected. If so, go to $808C. 8053-8057 : Was a button pushed to make cursor move? If no, go to 8070, which goes to $FF1C. 8059-806D : Handle cursor movement. 809D : Execution Point - "Press Start" Selected This is where it jumps back after selecting "Stage Select" on the Password Screen. [Stage Select / Castle Stage Intro's] 80E7 : Execution Point - Level ID loaded to $22 80FE : Execute Point - Entering Cossack / Wily Castle Intro Scene Start Here's some slight interesting ASM: It will check here if the Cossack Stages are cleared, and will jump to $83E8 in that case. However, the JMP $83E8 is never executed through the game. When doing the Wily Stage Intro, the game jumps to $83E8 from elsewhere. (not sure where). 8107-8219 : Cossack Stage Intro Code 821A-8236 : Cossack and Wily Stage Intro Code - Subroutine 8237-82FE : Stage Select Loop - Cursor Movement and Blinking Handler 82EA-82FB : Set cursor sprites to blank tile. 82FF-833B : Stage Select - Cossack Portrait Exception When all regular stages are cleared, this routine takes care of doing the slight palette blink and drawing cossack's portrait onto the stage select screen, when the Cossack stages can be played. 833C-83E7 : Cossack Stage Intro Code - After first stage clear. 83E8-8494 : Wily Stage Intro Code 8495-85AC : Common Screen Handler (Arguments: $10 = ID, $2A = ??) Returns after palette is faded up. 85AD-8626 : Huge RAM Clear Routine - Used by Common Screen Handler, Wily Stage Intro code and Cossack Stage Intro code (833C) and more. Called when gameplay starts. (from C555) 8627-> : Cossack/Wily Stage Map Sub (8107 & 833C) (Draw sprites of past path) 866B-> : Cossack/Wily Stage Map Sub (8107 & 833C) (Draw sprites of next path) 86B7-> : Cossack/Wily Stage Map Sub (8107 & 833C) (Animate destination point) 872E-884D / 7273E-7285D : Common Screen Palettes ($20 bytes for each ID) 7273E-7275D : Capcom Logo Palettes 7275E-7277D : Title Screen Palettes 878E-87AD / 7277E-7279D : Stage Select Palettes 7279E-727BD : Copyright Palette 87AE-87BD : Cossack Stage Intro - Some Palette 87CE-87ED : Cossack Stage Intro - Darkened Down Background Palette (?) 880E-882D : Wily Stage Intro palette - dark 882E : Wily Stage Intro palette - bright 884E-> : Common Screen ID: Screen Bank and Primary Graphics Load ID (Seems so) 8856 - 8859 : Common Screen sprite data offset table - Low 8857 / 72867: Title Screen (A1) 885A - 885D : Common Screen sprite data offset table - High 885B / 7286B: Title Screen (88) 885E-8866 / 7286E-72876 : Stage Select : Base Sprite Y coordinate for each selection. 8867-886F / 72877-7287F : Stage Select : Base Sprite X coordinate for each selection. 8870-8878 / 72880-72888 : Stage Select : Stage ID for each selection. 8879-887A-> : Common Screen: Sound ID 887D : Cossack Portrait Nametable Data 889F-88A0 : Data Belonging to 821A Sub. (Blink palette colors) 88A1-88A5 : Title Screen Sprite Data. 88BF-88D7 / 728CF-728E7 (18) : Stage Select - Selection Window Sprite Data 88D8-88F7 : Cossack Portrait Sprite Data 88F8-8997 : Cossack Stage Intro - Sprite Data 8998-89B7 : Cossack Stage Intro - Path Sprite Data 89B8 : 89DF-> : Wily Stage Intro - sprite data 8A0C-8B52 : Cossack/Wily Stage Intro : Past Path Sprite Data 8B53 : Cossack/Wily Stage Intro : Past Path Sprite Data - Low 8B5B : Cossack/Wily Stage Intro : Past Path Sprite Data - High [Stage Select Screen Data] Data: 8B63-8C3E / 72B73-72C4E : Portrait Sprite Data 8B63-8B8F / 72B73-72B9F : Bright Man 8B90-8BB8 / 72BA0-72BC8 : Toad Man 8BB9-8BE1 / 72BC9-72BF1 : Drill Man 8BE2-8BEA / 72BF2-72BFA : Pharaoh Man 8BEB-8C07 / 72BFB-72C17 : Ring Man 8C08-8C10 / 72C18-72C20 : Dust Man 8C11-8C2D / 72C21-72C3D : Dive Man 8C2E-8C3E / 72C3E-72C4E : Skull Man 8C3F-8C46 / 72C4F-72C56 : Portrait Sprite Data - Low Offset for each Boss 8C47-8C4E / 72C57-72C5E : Portrait Sprite Data - High Offset for each Boss 8C4F - 8C6B : VRAM Buffer Template for a blank Boss portrait (used for all stages which are cleared. The stage select screen graphics is over-written with a 4x4 tile blank box for each portrait area. This is just a template, it overwrites all the VRAM Address bytes with specific information before its written to Name Table VRAM.) 8C6C - 8C73 : Specific VRAM Address to blank out portrait - Low VRAM Address for each Boss 8C74 - 8C7B : Specific VRAM Address to blank out portrait - High VRAM Address for each Boss 8C7C : Execute Point - Boss defeated, MM warps out of level. 8CBC : Point - Init Weapon Get screen. 8E78 : Execute Point - Weapon Get Done, go to Password Screen. 8E8F : Jumped to from Game Over. 8EA3 : Password Screen (Stage Clear) Selection Loop 8ECC : Password Screen (Stage Clear) - Pressed A / Start, handling selection. 8EDE-8EF6 : Sub - Refill Weapon Energy. (Branched to from Game Over) 8EF7-8F48 : Password Screen (Game Over) ASM 8F3D : Password Screen Loop, if Game Over happened in Cossack or Wily stage. 8F49-8F92 : Weapon Get / Password Screen Subroutine - Init graphics, password screen palette, put text. 8F93-> : Stage Introduction ASM Subroutine. Called when regular stage is selected. 902D-9048 : Special code to create Ring Man's Sparkling Helmet For the animated palette in the 3 last background palettes, here is how the animated palette is calculated, directly in an ASM, (which means, if you want to change the loaded palettes, change the ASM) : Palette 1 : ((((stage ID)) * 2 + (stage ID)) + 92) Then, remove bit 7, which is there to say that the palette is animated. Palette 1 value result is in the accumulator at $8FF6 ($8FF6:9D F0 06 STA $06F0,X) Here are the results if you calculate them Bright Man : 92 Toad Man : 95 Drill Man : 98 Pharaoh Man : 9B Ring Man : 9E Dust Man : A1 Dive Man : A4 Skull Man : A7 Palette 2 : (Palette 1) + 1 Palette 3 : (Palette 2) + 1 7303F : Stage ID compare with #4 (?) 909C : Stage Introduction Animation Loop 90C7-9253-> : Wily Saucer sequence Jumps to 83E8 at end. 9254-9271 : Sub of Wily Saucer Sequence (Move stars) 9272-9280 : Sub of Wily Saucer Sequence (Arguments: A = # of frames to update sprites and do delay.) 9281-92C8 : Text Write Common Routine (Used by Boss Intro, Weapon Get) 92C9-92DE : Write Password Screen Text String to screen. (Subroutine of 8F49, 8EF7, and possibly more.) Y register is loaded with text string id. (See 9529 and 952E.) 92DF-92FE : Weapon Get Palette 92FF-937E / 7330F-7338E : Weapon Get - Megaman Portrait Palettes 92FF-930E : Flash Stopper (Bright Man) 930F-931E : Rain Flush (Toad Man) 931F-932E / 7332F-7333E : Drill Bomb (Drill Man) 932F-933E : Pharaoh Shot (Pharaoh Man) 933F-934E : Ring Boomerang (Ring Man) 934F-935E : Dust Crusher (Dust Man) 935F-936E : Dive Missile (Dive Man) 936F-937E / 7337F-7338E : Skull Barrier (Skull Man) 937F-938E / 7338F-7339E : Weapon Get : Rush Adaptor Spr Palette 938F / 7339F : Weapon Get : Got Rush Adaptor Blink : Color 1 ($16) 9390 / 733A0 : Weapon Get : Got Rush Adaptor Blink : Color 2 ($0F) 9391-93B0 / 733A1-733C0 : Wily's Saucer Sequence - Palette [Weapon Get Data] 93B1-93B8 : Weapon Get : Index of weapon achieved for each stage id index. 93B9-93D4 : Weapon Get - VRAM Buffer to clear old "You Got" letters. 93D5-94D8 / 733E5-73456 : Weapon Get / Boss Introduction Text Data Datas are as follow : -Determine Height and???-X Coordinate of the First Letter (the others are written after this one)-Then all the tiles to pick, ending with "FF" Note : This means the palette to write the letters is probably picked up by the ASM. 94D9-94F0 - 734E9-73500 : Weapon Get / Boss Introduction Text Offset - Low 94F1-9508 - 73501-73518 : Weapon Get / Boss Introduction Text Offset - High 733E5 - 93D5 : $00 = "You Got" 733EF - 93DF : $01 = "Flash Stopper" 733FF - 93EF : $02 = "Rain Flush" 7340C - 93FC : $03 = "Drill Bomb" 73419 - 9409 : $04 = "Pharaoh Shot" $05 = "Ring Boomerang" $06 = "Dust Crusher" $07 = "Dive Missile" $08 = "Skull Barrier" $09 = "Rush Jet" 734C9 - 94B9 : $0A = "Rush Marine" $0B = "Bright Man" $0C = "Toad Man" $0D = "Drill Man" $0E = "Pharaoh Man" $0F = "Ring Man" 734BD - 94AD : $10 = "Dust Man" $11 = "Dive Man" $12 = "Skull Man" 734DF- 734E8 : 94CF-94D8 : $13 = "Adaptor" $14 = "Pharaoh Shot" $15 = "Ring Boomerang" $16 = "Dust Crusher" 73448-73456 - 9438-9446 : $17 = "Dive Missile" [Password Screen Data] 9509-9528 : Password Screen Palette 9529-952D : Password Screen - Text data - Byte Pointer table 952E-9540 : Password Screen Text data (VRAM Buffer source) 0 - Blank text in text window. 9541-9567 : Password Screen Text data (VRAM Buffer source) 1 - "Stage select / Continue" 9568-9575 : Password Screen Text data (VRAM Buffer source) 2 - "Continue" only. 9576-9588 : Password Screen Text data (VRAM Buffer source) 3 - "Pass word error". 9589-9595 : Password Screen Text data (VRAM Buffer source) 4 - "Game Over". [Stage Intro Data] 9596-9615 / 735A6-73625 : Stage Introduction Screen - Initial BG Palettes Table read with Y, Y is Stage ID * 16 9616-961D / 73626-7362D : Stage Introduction - Sprite Palette Color $0 - $7 Those remains for every stage selected. 961E-965D / 7362E-7366D : Stage Introduction - Sprite Palettes (Color $8 - $F) Table read with Y, Y is Stage ID * 8 7362E-73635 : Palette for Bright Man 73636-7363D : Palette for Toad Man 7363E-73645 : Palette for Drill Man 73646-73649 : Palette for Pharaoh Man (P1) BODY (when selected) 7364A-7364D : Palette for Pharaoh Man (P2) JEWEL (when selected) 7364E-73655 : Palette for Ring Man 73656-73659 : Palette for Dust Man (P1) VACCUM (when selected) 7365A-7365D : Palette for Dust Man (P2) BODY (when selected) 73666-7366D : Palette for Skull Man [Misc Data] 965E-9671 : Wily Saucer Sequence - Stars Sprite data. [Password Screen] 9672-9839 : Password Screen (Password Enter) ASM 968D : Password entering loop 9722 : Point - It jumps back here after password error 972D : Password decoder / check 9772 : Jump to 981D 978E : Password check loop 97E1 : Point - Password OK 97FE : jump to stage select. 9801-981C : Password check subroutine 981D-9839 : Point - Password error 983A-9885 : Password enter loop subroutine 9886-98F5 : Password Generator ASM 98FA-9999 : Password Screen Sprite RAM setup 999A : Password Screen cursor Y coordinate data 99A1 : Password Screen cursor X coordinate data 99A8-99A9 : Password screen cursor add table 99AA-99AE : Password Table A Fields which cannot have dot in it 99AF-99B9 : Password Table B Sprite DMA byte index to 11 fields in the password, only 1 of the fields can have a dot in them. 99BA : Password table C 99CE-> : Password Table D 99E2-> : Password Table E 9A1E-9A27 : Password generator - Weapon energy memory index 9A28-9B2F : Debug Menu ASM 9B30-9B74 : Debug Menu Subroutine 9B75-9B7C : Debug Menu Sprite Palette Data 9B7D-9B84 : Debug Menu Sprite Palette Data 9B85-9C5D : Debug Menu Sprite RAM Data 9C5E -> ?? Data 73C86-7400F : Unused random data. 74010 <-> 7800F (Bank $3A <-> $3B by $2000) ------------------------------------------- [Object ASM Bank #3 and #4 - Enemies / Weapons / Items / Pickups.] MEMORY AREA: $8000-$BFFF Routines between addresses $8000 to $8823 can be called from any of the Object ASM banks, as this bank always is loaded into $8000-$9FFF regardless of where the Object ASM is. 74076 : Stage ID compare with #$04 (Rainbow bars related?) Code: it's in the middle of a function... 8016-802B / 74026-7403B : Check for every $0300 slot if there is an object ID, and if there is no ASM that was set when creating the object, load him an ASM with his object ID from table $8683 and $8753. So just putting an object ID in a slot, with a unique object ID is enough to have the enemy created. NOTE : SEEMS TO NOT WORK WITH EVERY OBJECT ID... BUT WORK WITH SOME THINGS 805A-8096 : Check if invincibility counter is off, else, RTS. Then, if going on, look for $805E explained at the end of this document. 80A7-80DA : Flash Stopper-specific code. Note : If you delete Flash Stopper and want to use it, make sure to change at $80A3 the code which allows it to come here when weapon is Time Stopper. 80DB-8107 : Rain Flush-specific code. 8110 : Handle Weapon Particle Collition? This is executed whenever a weapon/gadget hits another object. $8162 : Weapon is going to be deflected. 81BB-81C8 : Check if Mega Man is already in hurt state. If so, go on to $81C9. Code comes back together at $81C9. 81C1 : Check if there is a collision with Mega Man. If so, call $81CC because Mega Man is hit. 81CC : Subtract MM's HP when MM gets hit by object. (Subroutine, can be called from Object ASM) 823F-> : Routine, MM is defeated by enemies/hit by spikes. 8243 : Jump-in point if MM is hit by spikes. Data in ASM: 7426E : Delay before gameplay refreshes - (death by spikes) - Low 74273 : Delay before gameplay refreshes - (death by spikes) - High 82A4-83D2 / 742B4-743E2 : Sub - Subract Enemy HP, remove if no HP left, check if remove weapon object or not, etc. (Enemy is Hit by Particle) There are special ASM for Dust Crusher, Drill Bomb, Ring Boomerang, Wire Adaptor, Charged Shot and Charged Pharaoh Shot. The rest are managed the same way. 833A-834D : Special exception ASM for Cossack Stage 4, battle with Cossack. Ensures that object HP's are kept to a value of #2 or more. 8373-8380 : Since the life of Cossack Stage 3 boss is for each, half the life of a complete life bar, we must still draw the complete life bar. So the life bar with those boss is #$0E. When we reach this place, we add to it #$0E so it becomes a complete life bar (the graphic). 8413-84E2 / 74423-744F2 : Damage Objects does to Megaman, for each Object ID 84E3-85B2 / 744F3-745C2 : Object ID to drop when Object dead (?) (If more than 0), for each Object ID. 85B3-8682 / 745C3-74692 : Enemy ASM Bank for each Object ID 8683-8752 / 74693-74762 : Enemy ASM Address Low for each Object ID 8753-8822 / 74763-74832 : Enemy ASM Address High for each Object ID -- I think, for all the ASM beyond this point, bank $3B ($76010-7800F) is assumed switched into $A000-$BFFF. However, for the ASM before this point, the bank switched into $A000-$BFFF depends. -- 8823 : Single RTS (No Object ASM) Object ID's pointing here: $80, $81 8824 : Single RTS (No Object ASM) - Entry Point of Object ID $67 Object ID's pointing here: $26, $67 8825-884A / 74835-7485A : Buster Object ASM (Object ID $02) 8825 : Entry Point 884B-88BC : Weapon ObjASM Subroutine - Handle "Shootable" block. (Called as Subroutine of Weapon Object ASM) Check if weapon hits Shootable Block, if so: Draw blank tiles where block was, and make explosion sprite at the same point. Scanline Effect ID ($F0) must be set to #4 for this to do anything. 88BD-> Buster Object ASM - Speed Low Byte 88C3-> Buster Object ASM - Speed High Byte 88C9-88DD : Deflected Weapon Object ASM (Object ID $03) 88C9 : Entry Point 88DE-> Rush Items Object ASM (Object ID $04) 88DE-88F2 : Main Rush's ASM 88F3-881A : Rush Coil First Own Object ASM 891A-894A : Rush Jet First Own Object ASM 894B-8972 : Rush Marine First Own Object ASM 8973-8995 : Rush is dismissed (part 1) 8996-89E2 : Rush Item landed 89E3-8A36 : Rush Items Waiting for something to happen. 8A16-8A36 : Mega Man is on Rush Item. 8A37-8A5C : Mega Man on Rush Coil. 8A5D-8A85 : Rush is dismissed (part 2) 8A86-8B1C / 74A96-74B2C : Rush Jet moving. As soon as Mega Man was once on Rush Jet, it will always be there now. ----------------------------------------------------------------------------------------------------------------- All the following tables are read with the Y set from $A0. So they go from #$01 to #$03, which means that the address where is the table is never used. example, in the code, the table with values from $8B1D-8B1F is loaded at $8B1C,Y. 8B1D-8B1F / 74B2D-74B2F : Rush Items sprite to set right after landing. 8B20-8B22 / 74B30-74B32 : Rush Items $0408 Flag to set when he has landed. $8B23-$8B25 / 74B33-74B35 8B23-8B25 / 74B33-74B35 : Rush Items Sprite Flag values wich it adds to the Sprite Flag already in position. 8B26-8B28 / 74B36-74B38 : Rush Items Address Table - Low (Entry Point) 8B29-8B2B / 74B39-74B2B : Rush Items Address Table - High (Entry Point) The 2 followings are address tables. ASM for when driving Rush Jet/Marine The one for Rush Coil contains #$00 which are used to know when Rush item is current item. This is done this way, so if item is Rush Coil, they make a BEQ to send him somewhere else, and for the others they already loaded an ASM value. 8B2C-8B2E / 74B3C-74B3E : Rush Items Address Table - Low 8B2F-8B31 / 74B3F-74B41 : Rush Items Address Table - High For the following table, those belong to Rush Jet, and Y = #$00 is possible. So for example, table $8B32 is loaded in the code as $8B32,Y 8B32-8B35 / 74B42-74B45 : Horizontal Speed Low 8B36-8B39 / 74B46-74B49 : Horizontal Speed High 8B3A-8B3D / 74B4A-74B4D : Vertical Speed Low 8B3E-8B41 / 74B4E-74B51 : Vertical Speed High ----------------------------------------------------------------------------------------------------------------- 8B42-8B94 : Mega Man in Rush Marine. Set initial properties, then set ASM at $8B95. 8B95-8BA2 : Mega Man in Rush Marine ASM. Memory usage: ============= 468-47F : Object ASM Private Memory 1 For Rush Coil, Marine and Jet, this is Low counter untile Rush leaves when waiting for contact with Mega Man. 480-497 : Object ASM Private Memory 2 For Rush Coil, Marine and Jet, this is High counter untile Rush leaves when waiting for contact with Mega Man. 4B0-4C7 : Object ASM Private Memory 4 For Rush Jet/Marine, used as a counter to decrease their energy. 8BA3-8BFA Rain Flush (Capsule) Object ASM (Object ID $05) 8BA3 : Entry Point 8BFB-8CA3 : Balloon Adaptor Object ASM (Object ID $06) 8CA4-8D8E-> : Dive Missile Object ASM (Object ID $07) 8CA4 : Entry Point 8D8E-> : Data Table 8D9E-8E30 : Ring Boomerang Object ASM (Object ID $08) 8D9E : Initial Entry Point 8DBC : Entry Point #2 8DD7 : Entry Point #3 RTS : Not used by $8E31. 8E31-8E6E : Drill Bomb Object ASM (Object ID $09) 8E31 : Entry Point RTS : Not used by $8E6F 8E6F-8ECB : Dust Crusher Object ASM (Object ID $0A) 8E6F : Entry Point 8ECC-8ECF : Data Table 1 (Sprite ID for the 4 Small Pieces) 8ED0-8ED3 : Data Table 1 (Direction bits for the 4 Small Pieces) 8ED4-8F24 : Wire Adaptor Object ASM (Object ID $0B) 8ED4 : Entry Point 8F25 : Pharaoh Shot Object ASM (Object ID $0C) 8F40 : Pharaoh Shot (Being Charged) ObjASM (Object ID $0D) 8F9C-> : Table : Substance/Shape bits (Mem 408->) for each Sprite ID (Mem 558) (Used by Pharaoh Shot.) Possibly to update shape difference between smal shot and charged shot. 8FE6 : Single RTS (No Object ASM) - Entry Point of Object ID $0E 8FE7-8FFF : Skull Barrier Object ASM (Object ID $0F) 8FE7 : Entry Point 9000-90A1 : Ladybug Copter Object ASM (Object ID $10) 9000 : Main Entry Point 9063 : 2nd Entry Point 9073 : Called as Subroutine 90AA-90E9 : Movement Speed Tables - Used by multiple ASM code in same bank. 90EA-90EC : Ladybug Copter - Dropped Propel - Object ASM (Object ID $11) 90ED-91DB : Hover ASM NOTE : RTS NUBT 91DC-91DE : Hover : Bullets shot ASM (Object ID $39) 91DF-93AE : Slinky 91DF-934E : Slinky ASM 934F-93AE : Slinky Tables 93AF-942A : Desert Scorpion Generator NOTE : RTS UBT 942B-94E5 : Desert Scorpion 942B-94DB : Desert Scorpion (Object ID $14) Object ASM start. 94DC-94DE : table, use unknown?? 94DF-94E1 : table, use unknown?? 94E2-94E5 : Random "dash" time table. NOTE : RTS NUBT 94E6-9635 : Grasshoper 94E6-95F5 : Grasshoper ASM 95F6-9635 : Grasshoper's Tables NOTE : RTS NUBT 9636-96A1 : Unused Object ASM (Object ID $17) - Generate Jet Bird (Object ID $18) at random X location, then do nothing. THIS IS USED : 9689-969D : Function used by Jet Bird for Generation of Jet Bird Children. 96A2-9764 : Jet Bird ASM There is a RTS between them, and it is not used by any of them. 9766-97C2 : Jet Bird Children 9766-97AA : Jet Bird Children ASM 97AB-97C2 : Jet Bird Children Table 97C3-97D2 / 757D3-757E2 : Tables used by Wall Gun & Jet Bird Children enemy over wall gun 97D3-97E2 / 757E3-757F2 : Tables used by Jet Bird Children Enemy over wall gun 97E3-98D4 / 757F3-758E4 : Wall Gun's ASM NOTE : RTS NUBT 98D5-9924 / 758E5-75934 : Wall Gun's Tables NOTE : RTS N 9925-992A / 75935-7593A : Wall Gun's Bullet ASM NOTE : RTS N 9B07-9B51 / 75B17-75B61 : Whapper's ASM NOTE : RTS UBT 9B52-9B55 / 75B62-75B65 : Whapper's Rings object creator's Tables NOTE : RTS N 9B56-9C0E / 75B66-75C1E : Whapper's Rings object creator NOTE : RTS NUBT 9C0F-9C14 / 75C1F-75C24 : Whapper's Rings' property Table NOTE : RTS N 9C15-9C1A / 75C25-75C2A : Whapper's Rings' property Table NOTE : RTS N 9C1B-9C20 / 75C2B-75C30 : Whapper's Rings' property Table NOTE : RTS N 9C21-9C26 / 75C31-75C36 : Whapper's Rings' property Table NOTE : RTS N 9C27-9C2C / 75C37-75C3C : Whapper's Rings' property Table NOTE : RTS N 9C2D-9C32 / 75C3D-75C42 : Whapper's Rings' property Table NOTE : RTS N 9C33-9C8D / 75C43-75C9D : Whapper's Ring's ASM NOTE : RTS NUBT 9C8E-9CA1 : Common routine - Find Object with Object ID equal to memory $00. 9CA2-9D6B : Fly's Code / Object ID 33 / Enemy ID $13 9CA2-9D5A : Fly's ASM 9D5B-9D68 : Fly's Table 9D69-9D6B : Fly's Bullet ASM 9D6C-9E3B : Umbrella Metool's Code / Object ID 35 / Enemy ID $14 9E3C-9E3E : Umbrella Metool's Projectile's Code / Object ID 36 / Enemy ID ??? 9E3F-9EE5 / 75E4F-75EF5 : Fireworks Guy's ASM NOTE : RTS NUBT 9EE6-9F1C : Fireworks Guy - Object placed when shot - Object ASM - (Object ID $C8) 9F85-9FDE-> : Object ID $82 and $83 ASM (explosion like Drill Bomb) A0DC-A184 /760EC-76194 Super Ball Machine ASM NOTE : RTS UBT A185-A18C /76195-7619C Super Ball Machine Tables NOTE : RTS N A18D-A1DD /7619D-761ED Super Ball Machine's Ball NOTE : RTS NUBT A1DE-A222 : Falling Boulder - controller ASM (Object ID $40) (Enemy ID $30) A223-A286 : Falling Boulder, small pieces RTS NUBT A287-A2A0 : Falling Boulder Tables A2B9-A3B4 : Eddie RTS NUBT A3B5-A3D4 : Eddie's tables A436-A46C / 76446-7647C : Weapon deflection if hits from left. Used by Skullmet and probably other enemies A46D-A557 : Totempole A46D-A54C : Totempole's ASM A534-A54C : Totempole jumps A54D-A554 : Totempole's Table A555-A557 : Totempole's Bullet ASM A558-A6D2 : Metool (Jumping, Walking, Spinning) A558-A68F : Metool (Jumping, Walking, Spinning) A690-A69C : Metool's Table A69B-A6D2 : ??? bullet?? of metool? A93F-A951 : Water Air Bubble Object ASM (Object ID $66) AA11-AACB / 76A21-76ADB : Amoeba NOTE : RTS NUBT ABD5-AC00 / 76BE5-76C10 : Saturn Bot's ASM AC29-AC94 : Unused Object ASM.. NOTE : RTS NUBT AC51-AC94 : Entry Point of Object ID $68 (Unused) AC95-AD5D / 76CA5-76D6D : Skullmet ASM NOTE : RTS NUBT AD5E-AD69 / 76D6E-76D79 : Skullmet's Tables NOTE : RTS N AD6A-AD6F / 76D7A-76D7F : Skullmet's Bullet ASM NOTE : RTS N AD70-ADC2 / 76D80-76DD2 Helipon 1 - Flying ADC3-ADF0 / 76DD3-76E00 Helipon 2 - Falling ADF1-AE4B / 76E01-76E5B Helipon 3 - Waiting and shooting AE4C-AE4E / 76E5C-76E5E Helipon's bullet ASM AE4F-AF34 / 76E5F-76F44 Piranha ASM AE4F-AF34 / 76E5F-76F44 : Piranha's ASM AE4F : Waiting to see Mega Man to jump (if piranha hits a wall with this entry point, it just can't advance) AE94 : Jump on Mega Man AEFC : Don't know what it's for AF19 : Advance until it sees a wall and turn back, to set entry point back to AE4F B0D9-B16F / 770E9-7717F : Manta ASM B170-B197 / 77180-771A7 : Manta's Tables B3D9-B42F / 773E9-7743F : Mono-Roader ASM B430-B597 : Gachappon NOTE : RTS NUBT B430-B57A : Gachappon's ASM B57B-B58E : Gachappon's Table B58F-B591 : White Bullet's ASM B592-B597 : Red Bullet's ASM B598-B621 : Pakatto 24 B598-B61C / 775A8-7762C : Pakatto 24 ASM NOTE : RTS NUBT B61D-B61E / 7762D-7762E : Pakatto 24's Tables NOTE : RTS N B61F-B621 / 7762F-77631 : Pakatto 24's Bullet ASM NOTE : RTS N B622-B6DC : Up'n'down B622-B6DC : Up'n'down Controller NOTE : RTS NUBT B6DD-B6E4 : Up'n'down tables B6E5-???? : Water Mine B780 : Part of Spark Spine (Object ID $B7) ASM. B7C5-B85F / 777D5-7786F : Skull Launcher ASM B860-B8C3 / 77870-778D3 : Wheel Skull ASM B8C4-B94D : Spike Box - From both Left and Right - Generator (Object ID's $BD & $CE) B8E0 / 778F0 : Spike Box (Enemy ID $54) - Delay until new one appears - High B8E5 / 778F5 : Spike Box (Enemy ID $54) - Delay until new one appears - Low B94E-B972 / 7795E:77982 : Spike Box ASM BB6C-BBC2 : Decide items to drop when enemy dies BBC3 : ObjASM for Dropped Items (All of them) BBD3 : Execution Point - Megaman Reaches Item BBEE : Where we make the jump to the right place, depending on picked up item. Item: 0: Smal Weapon Energy Capsule 1: Big Life Energy Capsule 2: Smal Life Energy Capsule 3: Extra Life 4: Big Weapon Energy Capsule This can't be dropped by enemies, but has ASM address in the pickup handler jump table. 5: E-Tank BC01: E-Tank Picked Up ASM BC11: Big/Small Life Capsule Picked Up ASM BC15: Big/Small Energy Capsule Picked Up ASM BC24 : Increase Health/Weapon - Picked up Large Health Capsule BC44 : Balloon Item (Capsule) Obj-ASM Entry Point BC4A : Object ASM for Pickups (Object ID $C1) ??? and something else which goes on at BC66 BC7A-BC8C : Object ASM - Big Energy Capsule dropped by robot masters in rematch battles. (Object ID $C6) [Items Dropped when enemy is defeated] BC8D-BC91 / 77C9D-77CA1: Chance of item being dropped (00 is lowest, FF is highest... it's appropriate, but it's more complex, see "Tutorial - Object to Drop") BC92-BC96 : Sprite BC97-BC9B : Object Substance and Shape byte ($408()) BC9C-BCA0 : Written to Memory 0 ($468()). It's pointer for $F0F8 function. Low Counter is always #$FF for all. BCA1-BCA5 : Table which tells how much to refill for each item. Table is read using index Y being sprite ID So table read is $BC87. BCA6-BCAB : ASM Pointers for Pickups - Low BCAC-BCB1 : ASM Pointers for Pickups - High BCB2-BFFF : All unused random data. 78010 <-> 7A00F (Bank $3C by $2000) ----------------------------------- MEMORY AREA: $8000-$9FFF [Megaman Movement ASM / Weapon Menu ASM] 8083 / 78093 : This is here we upgrade $35, which is the counter for the charged buster shot. We check the sound and palettes to load... Set two CLC there is you want the charged buster to be impossible. 80E3-80F1 / 780F3-78101 : MM Movement ASM Picker : Take Mega Man status in $30 as an index, and pick his ASM in 80FA and 810E table. 80FA-810D : MM Movement - ASM Address - Low 810E-8121 : MM Movement - ASM Address - High ============================== ============================== 8130-8352 : Status is 00 Start ============================== ============================== 8130 / 78140 : MM Movement - Stand/Walk/Aim AND CHECK OTHER, AS WELL AS JUMP, AND SEND TO RIGHT CODE SECTION. ONLY COME HERES DIRECTLY IF STATUS IS $30. 8135-813D / 78145-7814D : Check if "A" is pushed. If so, go to $813E. It seems, to be here, Mega Man must be on ground. 813E / 7814E : Send here if you want Mega Man to jump. It checks there if Mega Man is on Rush Jet? and if down is held (slide). Better to have X at 0 if you send here, because it will be used as Mega Man's identifier. 8156 / 78166 : Slide starting code : $8147 sends here if the pushed buttons indicate Mega Man is sliding. You don't want Mega Man to slide in your game? Put a RTS here! 81B3 : Toad Man Stage Slide-Dust-Cloud exception - Here it chooses the Sprite ID for the dust cloud when Megaman slides. If at beginning of Toad Man's stage, it picks an alternate sprite. 81DC : Code comes here is Down is pushed. It checks if $46 contains ladder top. If so, set Mega Man status to be #$03 (climbing) 826C : Check for Toad Man's stage, create water effect when MM walks. 82C8 : MM Movement - Jump, Also Subroutine of 8130. 782E3 : Stage ID for which level the "Slippery" Block Type is functional in. Contents is $08 (Cossack Stage 1). 1st of 3 checks that need to be changed. 8320-8352 : Come here if Mega Man is on ground. If $30 is not #$00, it means Mega Man fell on ground, so do things such as playing "MM hit ground sound". ============================ ============================ 8130-8352 : Status is 00 End ============================ ============================ 8353-83F1 : MM Movement - 02 - Slide. 83D3 : Comes here when Mega Man stop sliding. 83F2-841F : Check collision with solid object (slot $0528). Only called with sliding, since it uses Mega Man Sliding's shape. !!!new!!! not 100% sure about it. I need to check it more RTS UBT 8420-84AC? : MM Movement - Ladder ASM Entry Point?? 84AD-854C : MM Movement - 04 - In Rush Marine. 854D-858C : MM Movement - 04 - Rush Marine's Speed Tables. NOTE : THOSE TABLE USE TOO MUCH SPACE FOR NOTHING. IT JUST LOAD THE DIRECTION BITS AND LOAD SPEEDS WITH THIS 854D-855C : Horizontal Speed Low 855D-856C : Horizontal Speed High 856D-856C : Vertical Speed Low 857D-858C : Vertical Speed High 858D-85DC : MM Movement - 05 - Using Wire Adaptor. 85DD : MM Movement - 06 - Hit by Object. (85E9 in Mega Man 4 Dr Cossack Treason) RTS NUBT 865D-86AC : MM Movement - 13 - MM escapes from Wily's Castle (Also Subroutine of 8775.) Called as routine from 8775. RTS UBT 86AD-86CD : MM Movement - 09 - Wait for boss to get ready. 86CE : MM Movement - 0A - "Ready" blink, Warp down. 8730 : Position at which we start checking if Mega Man hit floor. 8775-87A6 : MM Movement - 11 - Wire/Balloon Item achieved - Wait, then warp out. 87A7-884F : MM Movement - 0B - Boss Defeated - Weapon Get / Warp Out 8850-8894 : MM Movement - 0C - Battle with Cossack - Caught by cranes 8895-8919 : MM Movement - 0D - Cossack Stage 4 - Cossack Defeated 891A-8A6F : MM Movement - 0E - Cossack Stage 4 - Cossack Defeated (Dialogue Handler) 891A-89E4 : Main ASM 89E5-8A03 : Dialogue $00 Effect 8A04-8A5A : Dialogue $01 Effect 8A5B-8A69 : Dialogue $02 Effect 8A6A-8A6C : Dialogue - Special Effect ASM Address - Low 8A6D-8A6F : Dialogue - Special Effect ASM Address - High 8A70-8B37 : MM Movement - 0F - Wily Stage 3 Rematch Room Warp 8AEC / 78AFC : Song ID to play after Warp (Wily Stage 3) 8AF7-8B37 : Subroutine - Special stuff to do if warping to Rematch Room 8B38-8B8C : Routine : Conditional $528 setting (MM sprite bg-priority bit) for Wily Stage 3 8BE5-8C27 : VRAM Buffer Source - Additional Warp at Rematch Room in Wily Stage 3 (Used when warping back from robot master battle) 8C28-> : Data table for 8B38 8C33-> : Data table for 8B38 8C3E-> : Data table for 8B38 8C49-8C64 : MM Movement - 10 - Enter boss room - walk a bit forward 8C65-8CBC : MM Movement - 12 - Wily Stage 4 - Wily defeated. 8CBD-8CCB : Subroutine - Jump to Current Weapon's Init Code 8CCC : Mega Buster Init Code 8CF6 : B button is released here. It's either a Full or Incomplete Charged shot. Counter $35 is compared to #$20 at 8CF2. If it's only a bullet, it goes to $8D59. More than #$20, it goes on. 8DD5-8E3A / 78DE5-78E4A : Entry Point of Rush Coil / Rush Marine / Rush Jet Code 8DFD / 78E0D : If shooting, it comes here. 8E3B-8E9C : Rain Flush Init Code 8E9D-8F16 / 78EAD-78F26 : Entry Point of Wire Item Code. RTS is not used by next ASM. 8F17: Entry Point of Balloon Item Init Code 8F17-8F97 Balloon Item - Init Code IMPORTANT NOTE : RTS at 8F97 is used by next function. 8F98-9044 : Entry Point of Dive Missile / Drill Bomb / Ring Boomerang / Dust Crusher Init Code 8FE2 : Common Code for Setting Weapon's Object ID, etc.. (for the 4 weapons of $8F98) RTS : USED BY $9045. 9045 / 79055: Entry Point of Pharaoh Shot Code 79110 : Pharaoh Shot Code The following speeds are chosen by the following bits : Take the direction bits value you want, and divide them by 4. 9217-9219 / 79227-79229 : Horizontal low speed table of Pharaoh Shot 921A-921C / 7922A-7922C : Horizontal high speed of pharaoh shots 921D-921F / 7922D-7922F : Vertical low speed of pharaoh shots 9220-9222 / 79230-79232 : Vertical high speed of pharaoh shots 914E-91C1 : Entry Point of Flash Stopper Code RTS IS USED BY FOLLOWING CODE 91C2 / : Entry Point of Skull Barrier Code 91EB-91F8 / 791FB-79208 : Weapon Init Code Address - Low Mega Buster 91EB / 791FB Rush Coil 91EC / 791FC Rush Jet 91ED / 791FD Rush Marine 91EE / 791FE Rain Flush 91EF / 791FF Wire Adaptor 91F0 / 79200 Balloon Adaptor 91F1 / 79201 Dive Missile 91F2 / 79202 Ring Boomerang 91F3 / 79203 Drill Bomb 91F4 / 79204 Dust Crusher 91F5 / 79205 Pharaoh Shot 91F6 / 79206 Flash Stopper 91F7 / 79207 Skull Barrier 91F8 / 79208 91F9-9206 / 79209-79216 : Weapon Init Code Address - High Mega Buster 91F9 / 79209 Rush Coil 91FA / 7920A Rush Jet 91FB / 7920B Rush Marine 91FC / 7920C Rain Flush 91FD / 7920D Wire Adaptor 91FE / 7920E Balloon Adaptor 91FF / 7920F Dive Missile 9200 / 79210 Ring Boomerang 9201 / 79211 Drill Bomb 9202 / 79212 Dust Crusher 9203 / 79213 Pharaoh Shot 9204 / 79214 Flash Stopper 9205 / 79215 Skull Barrier 9206 / 79216 9207-> : Particle Weapons - Sprite ID's to Init 922B-926C : Subroutine - Check for Ladder grab. 7927D-7928C : Buster Charge - Megaman Palette Color 1 variants 7928D-7929C : Buster Charge - Megaman Palette Color 2 variants 7929D-792AC : Buster Charge - Megaman Palette Color 3 variants For the three above, it takes an index. For example, if index is 2, and if the Color 1 need to be changed, it is picked in 7927D + 2 = 7927F. Note : The index is first going in loop from 4 to 7, then from 08 to 0B, and then from 0A to 0D. When released, it does 00, 04 and 0C. Index 00 to 03 and 0D and 0E use are unknown. I think they're never used. 929D-92C4 : Buster Charge - 4-color palettes, after releasing charged shot. The 1st color of each palette is never read. Sometimes the color #2 of the 4 color palettes are read, other times the last 3 colors are read. There is palette updating ASM at $8D0C in the same bank as well as $804E. RAM location $36 is used specifically for this. The way palettes are updated after the charged shot is released, seems to be programmed sloppily. Look at the ASM at $8D0C. In detail, the Y register isnt increased when copying the palette, thus only one color is copied to Megaman's whole palette. Second, there is no write to RAM location $18, causing the palette buffer to be updated to the PPU randomly or not at all. Possible 4-color palettes read after B button is released: 08 : Immediatedly at 8D0C, random updates. 09 : Immediatedly at 8D0C, random updates. 00 : Immediatedly at 8D0C, random updates. 07 : At 804E next frame, sometimes after 08/09 at 8D0C, buffer written to PPU's VRAM. 01 : At 804E next frame, after 00 is read at 8D0C. Buffer written to PPU's VRAM. The other 4-color palettes are used too, seemingly only possible if a full charged shot is released upon entering a boos chamber. 92C5-938E : Subroutine - Toad Man stage / Cossack Stage 1 Check. Block Types "Glide Left" / "Glide Right" / "Special" (Snow & Water Falling on Mega Man's head) handler. Handler for "Slippery" block type. ASM for "wind" effect in Toad Man's stage. 92D6 / 792E6 : Stage ID for which level the "Rain" and "Glide effect" are functional in. 92DC / 792EC : Wind effect of Toad Man's stage happen for screen less than the one a this address 92E4 / 792F4 : Direction for Toad Man Rain 9314-> Toad Man Stage - Glide Left/Glide Right ASM 9332 / 79342 : Glide speed, low byte 933A / 7934A : Glide speed, high byte 9341 : Common ASM for this routine - (Wind effect/Glide) 9343-> Toad Man Stage - Wind effect ASM 9346 / 79356 : Strenght of Toad Man Rain 934A / 7935A : Frequency per turn of Toad Man Rain 938F : Subroutine - "Slippery" block handler. 793A2 : Stage ID for which level the "Slippery" Block Type is functional in. Contents is $08 (Cossack Stage 1). 2nd of 3 checks that need to be changed. 793AE : "Slippery" block effect - Effect deplete - Frame Counter bitwise AND, deciding ratio of depletion. Contents is $03. $07 makes it twice as slow, $0F four times slow, $01 makes it twice as fast, etc. 93C9-93DA : Put #$00 in $A3, $A7, $A8, #$01 in $A5, #$00 in $A6 (separated from $A3, $A7, $A8). Called by $93DB. Return Value : Set carry flag, meaning for $93DB stage is not Cossack Stage 1 93DB-9403 : Subroutine - Manages A3 to A8, no matter the stage (call $93C9 if not in Cossack Stage 1) Return : Carry Set if stage is Cossack Stage 1. 793EE : Stage ID for which level the "Slippery" Block Type is functional in. Contents is $08 (Cossack Stage 1). 3rd of 3 checks that need to be changed. 79431: "Slippery" block effect - Effect increase - Frame Counter bitwise AND, deciding ratio of depletion. Contents is $01. $03 makes it twice as fast, $07 four times fast, etc. 946E / 7947E : If no direction (right or left) button pushed, JUMP to $93C9. Put values in $A5-A8. 948C-94D0 : Subroutine - Water - Bubble generator. 94D1-9570 : Dialogue Data (1) 9571-95B5 : Dialogue Data (2) 95B6-95F1 : Dialogue Data (3) 95F2-95F4 : Dialogue - Offset - Low 95F5-95F7 : Dialogue - Offset - High 95F8-95FF : Unused space [Weapon Menu] 9600-96CE-> : Weapon Menu ASM 965D - 967A : Draw all the 32*32 of the Weapon Screen in the current screen. 967B-9685 : Load the Weapon Menu Palettes. Also Draw the sprites from $9E51 table. 9686-96AE : Draw Weapons or not, dependings if it is achieved. 96D7-96E7 : The loop on the weapon menu. It will go out only if start is pushed, to $9720. 968E : This is where it sets up the standard sprites to Spr-DMA Memory. 96E8-971F : E-Tank use code 9720 : Start/A button pressed 9731 : Weapon selected, leaving menu. 973A : IMPORTANT PLACE OF CODE! HERE, IT SETS #$00 in $30, meaning that whatever Mega Man was doing, he is now having the standing state. 974A-976E : Rush Coil/Marine/Jet Selected - Special Code 97AD : Load the Primary Scroll GFX of the selected Weapon. 983E : When closing the menu, this delete the weapons in slot X = 1 to X = 4 9885 : Weapon Menu - Draw Slot for Achieved Weapon/Item (Setup VRAM Buffer) 98D0-9921 : Weapon Menu - Draw E-Tank / Extra Life quantity 9922-9A85 : Weapon Menu - Button Press Handler ?? 9992 : For Highlighting weapon selected, and turning gray the old one. 999E : Continous Attribute Table Updater? 9A3A-9A85 : Update Rush/Megaman Sprites (9A3A called as Sub when showing Rush animation when Rush Items chosen.) 9A86-9AE2 : Weapon Menu - Draw Slot for Unachieved Weapon/Item (Setup VRAM Buffer) 9AE3-9B02 / 79AF3-79B12 : Weapon Menu Palette 9AFB-9AFE / 79B0B-79B0E : Coloring of hilighted Pharaoh Shot, Flash Stopper, Ring Boomerang 9B04-9B3E / 79B14-79B4E : Megaman Weapon Palettes The two following tables are where to draw the energy bar for each weapon. Written at $0780 and $0781: 9B3F-> : Nametable VRAM Address for each menu entry - Low For the cursor, look at B0 to BE, take the desired weapon, and substract B0. You have the index. 9B4E-> : Nametable VRAM Address for each menu entry - High For the cursor, look at B0 to BE, take the desired weapon, and substract B0. You have the index. 9B62-9B6C 79B72/79B7C : Weapon Menu - VRAM Buffer Source: (Quantity digits for E-Tank / Extra Life stuff) (2327) Note : Digits are corrected after. 9B71-9B7D-> : What to write to $A0 (Current Weapon) for each Weapon Menu selection. $0138 is the index. 9B81 : Menu Entry - 1st Attribute Data Byte Offset (A index for the $9B90 attribute table, loaded with the $0138 as an index.) 9B90-9B96-> : Menu Entry - 1st Attribute Datas. Contains datas for the $0780 tables, index by $9B81. Contains datas for the $0780 Buffer to know, if the weapon is selected, which TSA table to edit the palette. All the datas will be written there in orders. So first are the two pointers, then the byte for number of datas, then the datas. The datas are the coloring of a selected weapon. Bit 0-1 : Palette of TSA Block down right Bit 2-3 : Palette of TSA Block down left Bit 4-5 : Palette of TSA Block up right Bit 6-7 : Palette of TSA Block up left X = 00 : Mega Buster X = 07 : Flash Stopper X = 0E : Rain Flush X = 15 : Drill Bomb X = 1C : Pharaoh Shot X = 23 : Ring Boomerang X = 2A : Dust Crusher X = 31 : E-Tank X = 37 : Dive Missile X = 3E : Skull Barrier X = 45 : Rush Coil X = 4C : Rush Marine X = 54 : Rush Jet X = 5B : Wire Adaptor X = 62 : Balloon Adaptor 9BF9 : Menu Entry - 2nd Attribute Data Byte Offset (A index for the $9C08 attribute table, loaded with the $0139 as an index.) 9C08-> : Menu Entry - 2nd Attribute Datas. Contains datas for the $0780 address. All the datas will be written there in orders. So first are the two pointers, then the byte for number of datas, then the datas. The datas are the coloring of a not selected weapon. Bit 0-1 : Palette of TSA Block down right Bit 2-3 : Palette of TSA Block down left Bit 4-5 : Palette of TSA Block up right Bit 6-7 : Palette of TSA Block up left 9C70-9C73-> : Weapon Menu - Some Sprite Data 9D30 : Sprite letters - Sprite DMA Buffer index for menu entry's sprite letter, if it has one letter in its text that is sprite rather than bg. If none of the letters are a sprite, the value is 00. One byte for each menu entry. 9D3F-9D62 : Weapon Menu - Megaman and Rush Sprites Byte-offset Data for 9D63 (Two bytes for each Weapon/Item, one for two possible animations. The bytes points to where in the 9D63-9E50 to start reading sprites from.) Sprite Sets - Indexes to 9D3F: 00-17 : Megaman 18-19 : Rush (Animation) 1A-1B : Rush (Rush Coil Selected) 20-21 : Rush (Rush Marine Selected) 22-23 : Rush (Rush Jet Selected) 9D63-9E50 : Weapon Menu - Megaman and Rush Sprite Data 9D63-9D88 / 79D73-79D98 : Mega Man 9D89-9DB4 / 79D99-79DC4 : Rush standing : see 79DC7 9DB7-9DBE / 79DC7-79DCE : Rush's moving tail 9DC1-9DE4 / 79DD1-79DF4 : Rush Going into Marine Or Jet Manque queue 9DE8-9DF6 / 79DF8-79E06 : Rush Coil (only the spring and the back, since the rest is the same as Rush standing) 9DF9-9E28 / 79E09-79E38 : Rush Marine 9E2B-9E4E / 79E3B-79E5E : Rush Jet 9E51-9E7C : Weapon Menu Standard Sprites - Sprite RAM Setup 9E51-9E60 / 79E61-79E70 : Life Word 9E61-9E64 / 79E71-79E74 : "V" of Dive Missile 9E65-9E68 : "C" of Coil 9E69-9E6C : "M" of Marine 9E6D-9E70 : "J" of Jet 9E71-9E74 : "W" of Wire 9E75-9E78 : Left part of Mega Man's Head 9E79-9E7C : RIght part of Mega Man's Head 9E7D-> : VRAM Buffer - Name Table data to write to 2nd Name Table under this condition: Returning from weapon menu to Wily Stage 3, Second phase of battle with Wily. (Part 1) 9EE7-> : VRAM Buffer - Name Table data to write to 2nd Name Table under this condition: Returning from weapon menu to Wily Stage 3, Second phase of battle with Wily. (Part 2) 9F28 : Weapon Menu - Selection Black-out Template VRAM buffer 9F45-9F53 : Weapon Menu - Selection Black-out Name Table VRAM Address - High For the cursor, look at B0 to BE, take the desired weapon, and substract B0. You have the index. 9F54-9F62 : Weapon Menu - Selection Black-out Name Table VRAM Address - Low For the cursor, look at B0 to BE, take the desired weapon, and substract B0. You have the index. 9F63-9FFF / 79F73-7A00F : All unused. 7A010 <-> 7C00F (Bank $3D by $2000) ----------------------------------- [Object ASM Bank #5] MEMORY TYPE $A000-$BFFF: A000 : ?? Object ASM (Used by Ring Man Rainbow Bars) 7A267-7A27A : Rainbow bars - Index data for each Screen Position. 7A27B : Rainbow bars data. Data chunk (8 bytes): 0-1: Nametable VRAM Update Address. (Points to Upper-Left tile in Block to the right end of bar.) If Direction is Right, of Block to the left of bar. 2: Object X coordinate. (Points to mid of bar) (is ?0 or ?8) (Same as X placement of enemy) 3: 16x16 Level TSA TBlock to draw on void space. 4: Object Direction. (Direction which bar is to disappear, $1: from right, $2: from left.) 5: 16x16 Tile Y and X coordinate of bar. (Points to Rightmost block in bar, Leftmost if direction is Right.) bit0-3: 16x16 Tile Block Y coordinate bit4-7: 16x16 Tile Block X coordinate. Stored to Object Private Memory 4 ($4B0-$4C7) and Enemy HP ($450-$467) 6: Bar Length - in 16x16 Blocks. (Written to Object's Substance and Shape data byte?) 7: X Coordinate of Right or Left end of bar. (Object X Coordinate to set when Megaman steps on bar.) Left if direction is Right This is always '?8' (? is high nibble of hex value) A55B-A59C : Hippo's Missile Object ASM (Object ID $25) A5A5-> : Sprite ID Table A5D3 : Object ID $90 ASM A7E5-A805 / 7A7F5-7A815 : Snailbot's Bomb Object ASM (Object ID $2C) A846-A876 : ??? Object ASM (Object ID $2D) A877-A8BD / 7A887-7A8CD : [Ring Miniboss Defeat Handler] Object ASM (Object ID $3A) A8BE-A8C2 / 7A8CE-7A8D2 : Tables used by $A877. A90D-A97F / 7A91D-7A98F : Bright Man's Platform (Red) NOTE : RTS UBT A980-AA1E / 7A990-7AA2E : Bright Man's Platform (Green) NOTE : RTS NUBT AA1F-AA66 / 7AA2F-7AA76 : Bright Man's Platform (Green & Red)'s Table (Y quantity to add to platform) NOTE : RTS N AA67-AA85 : ??? Object ASM (Object ID $4B) AD0C-ADCF : Drill Man stage switch Object ASM (Object ID $5B) Also entry points of Unused Object ID's $57, $58, $59 and $5A. AFA6-AFAF : Dive Man stage moving spikes Object ASM (Object ID $CF) AFB0-AFB6 : Water Splash Object ASM (Object ID $6F) B033-B144-> : ??? - Object ID $74 ASM. B13C-B144-> : Tbl B148 : Cossack stage 1 boss Object ASM (Object ID $87) B148 : Initial entry point B319 : Subroutine B4C4 : Subroutine B5D2 : Table B5DE : Table 7B5FB-> : Floor Destruction - Name Table update data B65C : Object ID $89 ASM (Single RTS) B65D- : (Object ID $92) B796 : (ASM here which writes $94 to $300-$317) B9D6 : Subroutine of B65D. BA8B : Object $94 ASM BD9A-BFFF : Unused junk space. 7C010 <-> 8000F (Bank $3E <-> $3F by $2000) - HARD-WIRED BANK ------------------------------------------------------------- MEMORY AREA: $C000-$FFFF [Interrupts] ASM: C000-C126 : NMI! (Main Body) C127-C148 : NMI - Sound Engine Handler C149-C157 : MMC3 IRQ Handler C158-C310 : Various MMC3 IRQ Effect ASM C30E : 00 Jump Point (= No effect) C158 : 01 Entry Point C1A8 : 02 Entry Point C1E0 : 03 Entry Point C1E9 : 04 Entry Point - Dust Man Ceiling Scanline IRQ Effect C20F : 05 Entry Point - Dive Man Waves Scanline IRQ Effect C235 : 06 Entry Point - Dr. Cossack Battle Scanline IRQ Effect C252 : 07 Entry Point - Dr. Cossack Stage 2 Boss - Scanline IRQ Effect C2A0 : 08 Entry Point - Dr. Cossack Battle End Scene - Scanline IRQ Effect C2BF : 09 Entry Point - Giant Metool Battle / Wily Stage 3 Battle - Scanline IRQ Effect C2DC : 0B Entry Point C2FE : 0A Entry Point - Train Ride Ending Scene - Scanline IRQ Effect C311-C317 : MMC3 IRQ Tail (Return Handler) Data: C318-C323 : Scanline IRQ Effect - ASM Addresses - Low C324-C32F : Scanline IRQ Effect - ASM Addresses - High ASM: C330-C354 : Writing of VRAM Buffer to VRAM Note : This function is in some case accessed directly at $C334. C355-C35E : Disable NMI (PPU Control Reg #1 / $2000 / $FF - AND with #$11) C35F-C368 : Enable NMI (PPU Control Reg #1 / $2000 / $FF - OR with #$80) C369-C372 : Disable Display (PPU Control Reg #2 / $2001 / $FE - Write #0) C373-C37C : Enable Display (PPU Control Reg #2 / $2001 / $FE - Write #$18) C37D-C3D4 : Joypad Memory Update Routine (Read from Joypad Regs, store to $14-$17) C3D5-C420 : Pattern Table / Name Table / Attribute Table Clear Routine [Usage: A = Pattern Table / Name Table - High VRAM Address, X = Byte value to fill with, Y = If Pattern Table (A < $20): # of $100-byte chunks to fill/clear CHR-RAM with from start address. - or - if Name/Attribute table (A => $20): Byte to fill Attribute Table with. (If Name Table start address is given ($20, $24, $28 or $2C), it will automatically clear its Attribute Table as well with value in Y.)] Not to be called when Display is on. C421-C437 : Sprite DMA Buffer RAM - Clear Routine C438-C450 : Object Memory Arrays - Clear Routine C451-C4B7 : Palette Fade Up/Down Routine C451 : JSR Entry Point for Fade Up C457 : JSR Entry Point for Fade Down C4B8-C4D5 : Address Jumptable Handlers C4D6-C50B : 2nd Thread ASM (Random Generator, Palette Animation) C50C -> : Start-Up ASM (Starting Point of Main Thread) C539 : When gameplay is about to begin, program returns here. (Seems to happen only at first time gameplay starts) C541 : If MM looses a life (no Game Over), game jumps back here. Also jumps back here from C82C. C5A6-C5C3 : This is where the first screen is drawn to Nametable before fading palette up. C6D4-C706 : Special case writes to $EF, for Cossack Stage 1, Pharaoh Man's Stage and Toad Man's Stage. There are also some of those cases $CF67. C68B : Draw exception for Wily Stage 3 for Screen Position #9. (Rematch warp room) If game starts on this screen, and all robot masters have been defeated, it will draw the additional teleporter to the Wily battle here and also set up an additional sprite. C6CD : Execution Point - Palette is Faded up when Level begins C6F3-C7F5 : Main Game Loop C6F3 : Give Sprites BG Priority in Cossack Stage #1 (Continuos Check) C707-C73F : Check if Weapon Menu is to be opened. C731-C73D : Entering Weapon Menu C740-C74C : Handle Megaman's Movement ASM C74D-C759 : Handling of Object ASM C75A-C765 : Handle Scrolling C766-C775 : Handle Initalizing of Stage Enemies/Items C776 : Call $E0FA : Ring Man Rainbow Bars handler loop add-on. C779 : Call $E35C : Auto Screen Updates handler. (Checks memory $1B/$1C). C77C : Call $E262 : Auto 32x32 Tile redraw. C77F : Call $E492 : In-Game Palette Fade Handler. C782-C784 : Call $E49C : Drill Man's Stage-specific ASM? C785-C787 : Call $E4DD : Dust Man stage Shootable Blocks loop add-on. C788-C791 : Update Megaman's Horizontal movement speed ($37 copied to $3A8, $38 copied to $3C0.) C792-C7B3 : Mid-Point Pass Check? C7B4-C7BD : Updating of Sprite DMA based on Object Sprites. C7C6 : Return to Thread Handler (JSR $FF1C) (And Wait for Screen Refresh) C7CB : If memory $30 is $07, $08, $11 or $13, it counts down mem $133/$134 until 0 and jumps to $C6F3, else to $C7F6. C7F3 : End. Return to C6F3 C80B-C852 : Decides what to do when gameplay ends by different means. Can go to Ending and Credits, can go to Weapon Get or Password screen or Cossack/Wily stage maps, can restart gameplay if megaman lost a life or got Balloon or Wire adaptor, or go to Game Over screen. C82C : When gameplay is about to begin, program returns here. (All times expect the first time of a playthrough) C853-C85A / 7C863-7C76A : Megaman's Palette C85B-C86A : Sound ID to Init for each Level. C86B-C87A / 7C87B-7C88A : Bits to OR with $528 (Megaman's Sprite Flags, see Mem 528-53F) for each Level. C87B-C88A / 7C88B-7C89A : Y Coordinate to give sprites below it background priority, for each Level. (Written to $EF). C88B-C8AA / 7C89B-7C8BA : Screen Preset where Mid-Point / Boss-Point is passed 2 bytes for each Level ID (Mid-Point, then Boss-Point). This data must be set for Mid-Point / Boss-Data to work. For continue-points that arent used, the value is set to $FF. note: This defines the screen where the continue point is activated, while Bytes 1 and 5 in the data below defines where MM will start if defeated. C8AB-C92A / 7C8BB-7C93A -> : Mid-Point / Boss-Point Data for All Stages Each stage has 8 bytes. byte 1 : Mid-point: Screen Position byte 2 : Mid-point: Scroll Map Position byte 3 : Mid-point: Primary Graphics Load ID to load (00 = None) byte 4 : Mid-point: Palette Set byte 5 : Boss-point: Screen Position byte 6 : Boss-point: Scroll Map Position byte 7 : Boss-point: Primary Graphics Load ID to load (00 = None) byte 8 : Boss-point: Palette Set C92B-C96D : Wily Stage 3 rematch warp room - VRAM Buffer Source for drawing 9th teleporter (If all clear). [Scrolling] ASM: C96E-CBFC-> : Scrolling ASM C981-C9D0 : Start of Cossack Stage 3 Auto Scrolling Code. CACF : Reading of Multipaths (Horizontal Scrolling) CAFF : Execution Point - MM moving through boss door / (Horizontal Scrolling) scrolling right check. Jump in from $CA6F CB43 : Execution Point - Handling Boss Doors Data in ASM: 7CB90 : Megaman - Movement Speed when scroll right - Low 7CB98 : Megaman - Movement Speed when scroll right - High CC03-CC12 : Boss-Doors: Screen Position of level to skip boss-door wrap down after entering boss screen. (0 means no screen. This data is set for most Cossack/Wily levels.) CC13-> : Scrolling ASM (Vertical Scrolling) CCD0 : Reading of Multipaths (Vertical Scrolling) CDD5 : Point - Megaman approaches a new screen Data in ASM: 7CE08 : Vertical Screen Scroll Speed - Down 7CE18 : Megaman - Movement Speed when climbing ladders Down - Low 7CE20 : Megaman - Movement Speed when climbing ladders Down - High 7CE32 : Vertical Screen Scroll Speed - Up 7CE40 : Megaman - Movement Speed when climbing ladders Up - Low 7CE48 : Megaman - Movement Speed when climbing ladders Up - High CEE1-CFA0 : Handle Stage Part Data (Scroll Map Data), set up memory and registers for new screen. CEEA : Check Palette Set Byte for current Scroll Map. CF67-CF9C : Special case writes to $EF, for Cossack Stage 1, Pharaoh Man's Stage and Toad Man's Stage. There are also some of those cases which use table $CFA1 at $C6D4. CFA1-CFB0 : Value to write to $EF for each Scroll Map, in Toad Man's Stage. CFB1-D04D -> : Horizontal Scrolling - Nametable Updates (Setting up of buffer) D04E-> : Attribute Table AND Table with AT Work RAM (640->) D050-D051 : Attribute Table AND Table with New Attribute Byte D052-D142 : Vertical Scrolling - Nametable Updates (Setting up of buffer) D143-D16E : Nametable Updates - Some Routine (Soubroutine of Scrolling ASM) D16F-D170 : Table Used by D052 D171-D172 : Table Used by D052 D173-D176 : Table Used by D052 D177-> : Table Used by D052 D17B-D17C : Table Used by D052 and D143 D17F-D1C4 : Scrolling Nametables Updates - Return 8x8 Tiles Used in a 32x32 Tile field. $29 is 32x32 Tile field in Screen to return data for. (Note: Refers to area in screen, not a 32x32 tile set in stage data. The routine reads Screen Data based on $29.) Needs $20-$21 set up. Sets up $7C0-$7CF and returns Attribute Table byte in $10. Used by both CFB1 and D052 D1C5-D24A : Nametable Updates Special Exceptions - Sub of D17F 7D1D8 : Stage ID for Hidden Blocks/Switch feature (graphics updates) D1CF-D22F : Ring Man Rainbow Bars Exception. For 16x16 Tiles: $09 (Rainbow Bars - First Part) $8C (Rainbow Bars - Second Part) This thing's purpose is to draw black tiles instead if there's a Rainbow Bar at nametable row/collumn being updated, if that part of the bar is cut off/void/black/w.e. D230-D24A : Drill Man "Switch" Exception (Change Tile Palette to #1 if Screen's Switch is turned On. See Mem $680.) D24B-D294 : Nametable Updates - Dust Man Shootable Block Exception - Sub of D17F This make the shooted Shootable Block non solid. D295-D2B9 : Scroling Nametables Updates Sub - Read Screen Data and set 32x32 Tile Data Address. D2A2 : Entry Point from D2FC (Past Bankswitching) D2BA-D2BD : Table used by D17F and D24B D2BE-> : Table used by D052 D2C6-> : Table used by D052 D2CE-D2FB : Nametables Updates - Set a screen's Screen Data Address to $20/$21 (Y is Screen Position, $22 is Stage/Level.) Sub of CFB1 and D052 D2D7 : Entry Point from D2FC (Past Bankswitching) D2FC-D427: Hit Detection : Objects with Stage Walls. (Vertical Detection/Vertical Collision) [Arg: Y = Shape data couple index.] Note : if calling this function directly, it only checks collision with the sent pointer, not the Shape data couple. Returns result in Mem $10, $11, and $45/$46/$47/$48/$49 stores the TSA ID from left to right under : example, for Mega Man there are values in $45, $46, $47 $10, Same as $41, in most case. In fact, $10 contains the bits of every object that is touched, because every time something is touched, we take this new value and make a ORA of $10. For example, if $10 contains #$10 (solid) and we hit water (ORA #$60), it contains #$70. ?$11 : Contains the Y position of the hit block. $41 : 16x16 Tile Type of 16x16 Tile Object has hit with highest value (see $41 at the start of the document). (Result of D2FC). D397 : Hit Detection - Check for Rainbow Bar D39A : Hit Detection - Cossack Stage 1 Boss Check D39D : Hit Detection - Dive Man? Drill Man? D3A0 : Hit Detection - Dust Man Shootable Blocks D3A3 : D661 Call - Wily Stage #3 - Virtual Platform in rematch room after all clear. D428 : Hit Detection : Objects with Stage Walls. (Horizontal Detection/Horizontal Collision) Returns result in Mem $10, and $45/$46/$47 D4C8 : D599 call D4CB : D5DA call D4CE : D5E6 call D4D1 : D624 call D4D4 : D661 Call - Wily Stage #3 - Virtual Platform in rematch room after all clear. D53A- : ?? Sub of D2FC D552-D58C : Dust Man Shootable Block Exception ?? Sub of D2FC D58D-D598 : ?? D599-D5D9 : D2FC Sub (Ring Man Rainbow Bars?) 7D5B1 : Stage ID compare with #$04 (Rainbow bars related?) D5DA : D2FC Sub (Cossack Stage 1 - Mothraya boss extra stuff) D5E6-D623 : D2FC Sub (TSA Block exceptions: Dive Man Waves, Drill Man conditional surface, Ring Man "Ring-guy" miniboss with blocked path.) Every structure are passed in this, in $29. We check all of them, and depending on the level we are in, we check if for the block there is an exeption at a certain moment. For exemple, every turn, all the block in Ring Man stage are checked. When Whapper is defeated, some blocks must be destroyed, so here, when we check those blocks, if Whapper is defeated, we destroy them. D5EF / 7D5FF : Stage ID for Hidden Blocks/Switch feature (physics) D5F2-D60D / 7D602-7D61D : This is here we choose to not consider the Ring Man's Whapper blocks for the collision. D624 : D2FC Sub (Scanline Effect #4?) D661-D690 : D2FC Sub (Wily Stage 3 - Virtual Platform in rematch room after all clear.) D691-D695 : Ring Man's stage: Screen $0A Ring Miniboss: 32x32 tiles which are free to pass when miniboss is defeated. D696-D69D : Wily Stage #3 - Rematch Room - Virtual Platform data D69E-D6DD : Object/Wall Hit Detection (Vertical) - Shape Data - Offset - Low D6DE-D71D : Object/Wall Hit Detection (Vertical) - Shape Data - Offset - High D71E-D807 : Object/Wall Hit Detection (Vertical) - Object Shape Data Pointer Address ======= ======= 00 D71E-D722 Down pointer has one more datas. It's done because there are some case which code needs to checks if there is a collision in the middle of Mega Man. It's done with ladder top for example : when grabbing it, it check if the middle coordinate point is touched. If so it is grabbed, else not because Mega Man is touching it but is too far. 01 D723-D726 18 D777-D77B 19 D77C-D780 D808-D847 : Object/Wall Hit Detection (Horizontal) - Shape Data - Offset - Low D848-D887 : Object/Wall Hit Detection (Horizontal) - Shape Data - Offset - High D888-D99E : Object/Wall Hit Detection (Horizontal) - Shape Data Pointer Address ======= ======= 00 D888-D88C 01 D88D-D891 0E D8BF-D8C2 0F D8C3-D8C6 D99F-D9B6 : Called by F000. Has with Object movement to do. D9B7-D9CC : Called by F049. Has with Object movement to do. D9CD-D9E6 : Put Mega Man under of the hit block detected in D2FC. Called from F0F3, F225, and from certian megaman movement ASM (ROM offset 78507) Called when using Rush Marine. It's called after a call to $D2FC (and maybe others) because it uses the value it sets in $11. Call it if with movement up, there is no more any contact with water. If so, using $11, it set back item in water. D9E7-DA04 / 7D9F7-7DA14 : Put Mega Man on top of the hit block detected in D2FC. Uses $11 to set MM back to position without collision In $D2FC, we could find exactly what it is, since the $11 used come from this function. (when called by $F3C1). Called from F0BC, F1F5, F3C1 and F3DE. DA05-DA8A : Primary Graphics Load - Loader Routine [Use: X = ID] DA8B-DABA : Scroll Graphics Load - Init Routine [Use: A = ID] DABB-DB39 : Scroll Graphics Load - Handler/Writer Routine DB3A-DB71 : Draw Sprites. (Write to $200-$2FF, which is later copied to SPR-RAM using DMA.) DB72-DEE1 : Draw Object to $200-$2FF - X is Object Slot. This chunk of ASM also does all sorts of other stuff. DB8F : Is enemy out of Y screen? Use $0528 to know if it has bit to be alive. Also, if he has, he needs specific Sprite ID or object ID to survie (see $DBDA) This is the place where we check if an object is out of Y screen. If it's Mega Man, go to $DC14. DBDA-DBFF : A check by Object ID for some object that can survive even if out of screen. DC00-DC13 : Remove Properties of Object in Slot indexed by X Register. (This is called as Subroutine plenty of places.) Those properties are, with X index : $300, $450, $5A0, $5B8 and put #$FF in $438. DC14 : MM not in Y Screen #$00! Check if... ASM : Megaman falls down pit. code is at DC14. At dc1F is if it's the first time we come here. DC30 / 7DC40 : Falling down pit : Delay before gameplay refreshes - Low DC35 / 7DC45 : Falling down pit : Delay before gameplay refreshes - High DD5E-DD6D : Value for each Level, has with sprite invicibility to do. (When enemies are hit.) This value is Sprite Bank's Tile Usage data ID to use for "blink" effect. If the value is 0, it does palette blinking. (Used for Cossack/Wily stage bosses.) DD6E-DE49 : Update Object's Sprites to Sprite DMA Buffer - Continued (A = Actual Sprite Bank's Coordinate ID, X = Object Slot) DE4A-DE71 : Subroutine - Actively copy parts of Source Palette to Palette Buffer. Done at all bosses. DE72-DE8C : Subroutine - Blink effect for Cossack and Wily bosses. DE8D-DEE1 : Jump-to point - Handle blink effect for mini-bosses. Jumps back to DD30. DEE2-DEF1 : Draw Energy Bars (In order from 0 to 2) DEF2-DEFF : Draw Energy Bars (In order from 2 to 0) DF00-DF58 : Routine for setting up Energy Bars to Sprite DMA. (X = slot in the $0130 values) DF1E / 7DF2E : Y Coordinate of Bottom Sprite of all Energy Bars. DF59-DF5B / 7DF69-7DF6B: Energy Bar Sprite Attribute Bytes DF59 / 7DF69: Megaman Health DF5A / 7DF6A: Weapon/Gadget Energy DF5B / 7DF6B: Boss Health DF5C-DF5E / 7DF6C-7DF6E: Energy Bar Sprite X Coordinates DF5C / 7DF6C: Megaman Health DF5D / 7DF6D: Weapon/Gadget Energy DF5E / 7DF6E: Boss Health If you want to free the two following code sections because you don't have Rain Flush anymore, remove this JSR : $DB3A:20 5F DF JSR $DF5F. Also, note that 13A and 13B won't be necessary anymore. DF5F-DFBD : Rain Flush effect handler - Updates registers and writes to Sprite DMA Buffer. DFBE-DFF9 : Rain Flush Sprite Y and X setup data DFFA-E0F9 / 7E00A-7E109: Upper Sprite Bank Data to use for each Object ID E0FA-E20D : Some Ring Man's Stage Game Loop ASM. (Rainbow Bars) E20E-E261 : Unused Routine! Might be old subroutine previously used for Rainbow Bars or Shootable blocks. The RTS at $E261 is used by $E262. E262 : Draw 32x32 Tile location in Memory $1D if value => $80. Updates done to VRAM Buffer, not direct write to VRAM. E333-E424 : Auto Screen Updates Handler E35C : JSR in point from game loop. E425-E428 : Table used by E333 E429-E49B : In-Game Palette Fade Handler E49C-E4DC : Drill Man stage-specific ASM - Attribute Table updates E4DD-E571 : Shootable Blocks - Update Name Table and graphic. (Main Loop Subroutine) this function update the graphic of the block, not the type the type is d24b Jump in from $C785 E572-E576 : Data used by D24B (Scrolling Nametable Updates - Dust Man Shootable Block Exception) Pointer to Shootable Block data for each screen from Screen Position $C. Note : This means that to read this table, you read $E566,X, where X is the X screen position where the Block met the Weapon. E577-E5C3 : More Data used by D24B (Scrolling Nametable Updates - Dust Man Shootable Exception) Shootable Block - 32x32 tile position data. Data pair: Byte 1: 32x32 tile position (Value $80-$FF ends data.) In a specific X screen. Byte 2: Bit Offset in memory ($680-$6BF) (E578 table) Summary : E572 tells where are the Structure datas for each X screen in the E577 table. Then, each data in E577 table is a structure where there are Shootable Blocks. E572-E5C3 : Tables used by E4DD E5C4-E5C7 : Table used by E4DD E5C8-E679 : Boss Rematch room prepare routine. E67A-E681 : Scroll Graphics Load ID's to load for each robot master's rematch room. E682-E750 : Boss Door Wrap-Up Drawing ASM E751-E80F : Boss Door Wrap-Down Drawing ASM E810-E813 : Table used by E751, and possibly E682. E814-EFFF : Unused Random Data. [$F000-$FDFF Region: Object ASM/Enemy AI Routines] note: For most of these routines, object slot is loaded into X register as argument. F000-F048 : Check for Object Hit with Walls (To the Right of Object, i think) + move. - (X = Obj Slot, Y = Arg) Routine Calls of this Sub: F22D F843 F8F9 F02A F049-F087 : Check for Object Hit with Walls (To the Left of Object, i think) + move. - (X = Obj Slot, Y = Arg) F088-F0C0 : ? Vertical check.. (Down). Also update movement [Carry is set if floor hit] F0C1-F0F7 : ? Vertical check.. (Up). Also Update movement. [Carry is set if ceiling hit] F0F8-F22C : Jump Movement (gravity influenced) + Floor collition check [Arg: Y = data index, Result: Carry Flag = Floor hit. Carry is Set if floor is hit.] F1CE : Code for Pharaoh Man's Quicksand tiles, check if in Pharaoh Man stage, and if not, make a CLC and then a RTS. F22D-F24A : Update X (Horizontal) Movement (Move Right) F24B-F268 : Update X (Horizontal) Movement (Move Left) F269-F288 : Update Y (Vertical) Movement (Move Down) F289-F2A6 : Update Y (Vertical) Movement (Move Up) Identical fo $F2D8. F289-F2A6 : Subtract Y coordinate according to Movement Speed. F2A7-F2B7 : Update Vertical Object Movement (Jump). No wall hit detection. (gravity influenced) F2B8-F2D7 : Sprite Movement Up / Down according to Speed (F17C) F2D8-F2F5 : Update Y (Vertical) Movement (Move Up) Identical fo $F289 Called at $F1FE (function $F0F8) Called at $F2B2 F2F6-F323 : Sprite Movement Up / Down according to Gravity (F1B0) Note : It also limits the vertical speed to F900. F324-F32E : Set Vertical Movement Speed to FF00. F32F-F37B : Functions whichs makes checks before calling $F37C. The big difference with calling directly $F37C, it is that it checks if Mega Man is on enemy (like with Hover enemies in Pharaoh Man stage). For the Whale in Dive Man stage, it uses an exception to go to $F37C. Used for Whale Sucking, Pharaoh Man's Hover enemy, Rush Jet and maybe more. [Arg: X = Object index which makes Mega Man moves with him Object direction bits as the direction where Mega Man goes] IMPORTANT NOTE: The big problem is that it's often called after the object moved. So if for example you jump on Rush Jet, but are just on the edge of it, it will move before, then this function will be called, and Mega Man is not anymore over Rush Jet, si he'll fall from it. F37C-F3C0 : Routine for Dust Man's suck action. Also Dive Man's whale. NOTE : It is called by $F32F, a function which checks few things before calling $F37C, like if Mega Man is in contact with object before (exemple with Hover in Pharaoh Man's stage). F3C1-F3EC / 7F3D1-7F3FC : Check if Mega Man had a Vertical collision with a wall. Take Y as Vertical Wall Detection ID, depending if Mega Man is sliding, or standing. (#$02 if not sliding, else it's #$04). If he had a Vertical Collision while on the platform, call $D9E7, which put Mega Man on the hit floor) Used by Bright Man's Green Platform (not the Red one) F3ED-F3FF : Update Horizontal movement + Check for Object hit with Walls, both Left and Right [Arg: Y = Shape data couple index.] (When function returns, Carry Flag contains wall hit status. If set, a wall has been hit.) Function also update $0528 Flag. F400-F412 : Update Vertical movement + Check for Object hit with Walls, both Above and Below. [Arg: Y = Shape data couple index.] (When function returns, Carry Flag contains wall hit status. If set, a wall has been hit.) F413-F433 : Update Horizontal Object Movement. F434-F445 / 7F444-7F455 : Update Vertical Object Movement. (Not gravity-influenced) F446-F451 : Set Sprite ID. ($558,X) [Arguments: A = Sprite ID] F452-F49B : Duplicate Object, with given sprite id. [Arguments: A = Sprite ID, Y = Destination Object Slot] NOTE : OBJECT ID WILL NEED TO BE SET. F46B : Jump-in point from $F49C routine. F490-F49B : Used as subroutine in various ASM: Set sprite of object in slot Y. F49C-F4DB : Set Object Position Relative to Other Object [Arguments: $10 = Relativity Pointer, Y = Destination Object Slot, A = Written to $558,Y (Sprite ID), X = Object from which the new object is positionned.] (Uses tables F50B, F573, F5DB and F643, with pointer given in $10) TABLES ****** F50B / 7F51B : How far from the other object (Horizontal) Values depends on F573 : If F573 is 00, values goes from 00 to FF If F573 is FF, values goes from FF to 00 F573 / 7F583 : Relative position given at F50B : to the right or to the left? 00 : Right FF : Left F5DB / 7F5EB : How far from the other object (Vertical) Values depends on F643 : If F643 is 00, values goes from 00 to FF If F643 is FF, values goes from FF to 00 F643 / 7F653 : Relative position given at F5DB : up or down? 00 : Down FF : Up F4DC-F4F5 : Set $420,X based on relative position to Megaman (Make object face Megaman.) F4F6-F50A : Set $528,X byte based on $420,X (Set sprite mirroring bit based on movement direction.) 7F51B-7F582 : Relative Coordinate Set Table A 7F583-7F5EA : Relative Coordinate Set Table B (Screen) 7F5EB-7F652 : Relative Coordinate Set Table C 7F653-7F6BA : Relative Coordinate Set Table D (Screen) F6AB-F6BB : Invert Object's Horizontal Direction (Left<->Right) - Arguments: X = Object Slot F6BC-F6D6 : Sound Init Array Write - Sound ID Init Routine (Called with Sound ID# in A) (F6BE for Sound Effects) F6D7-F6E5 : Return Relative Y Coordinate to Megaman. [Return val: A = Relative Y Coordinate, X = Design other object, Carry Flag is set if Mega Man is at under the object.] F6E6-F6FC : Return Relative X Coordinate to Megaman. [Return val: A = Relative X Coordinate, X = Design other object, Carry Flag is set if Mega Man is at right of object.] Variables not used : $10 F6FD-F70E : Set Mega Man position to be used by function it calls after setting values : F71E. [Arg: 00 = Mega Man's Y, 01 = Mega Man's X, 02 = Mega Man's X Screen] For the return value, see F71E (Uses F71E) F70F-F71D : Set Object defined by Y position to be used by function following : F71E. [Arg: 00 = (Object defined by Y)'s Y, 01 = (Object defined by Y)'s X, 02 = (Object defined by Y)'s X Screen] For the return value, see F71E NOTE : It doesn't call F71E, it follows, it's in the same function, but it's easier to see them as separate function, since F6FD use F71E to. (Uses F71E) F71E-F775 : Prepare values for functions from position between two objects. From them, one known, F7A6, so enemy go toward Mega Man or another object (defined by the caller : F70F or F6FD) and then make circles over him. [Result: 00 = Distance between the two (X or Y coordinate, depending which one is smaller. If they are equal, it contains X distance) 01 : Distance between the two (X or Y coordinate, depending which one is bigger. If they are equal, it contains X distance) 02 : Contain a pointer used in the function to read table F776 A : It contains a value from F776 table. Seems to have a mean about the distance between 2 object. Y : See down here. NOTE: It's used by the function and seems to not be used by the callers. It's a pointer on a table, for a value which is used by the calling function.] (Uses table F776, read from it with Y) (Used by F6FD and F70F) HERE IS HOW Y IS BUILD : Y value (start from 00, and do steps in order) : - Plus 01 if Y distance > X distance - Plus 02 if (caller) at the right of (owner) - Plus 04 if Y coordinate of (owner) < those of (caller) * Multiply the numbers summed by 4 - Plus 01 if bigger distance divided by 2 is smaller than the smallest distance - Plus 02 if bigger distance divided by 4 is smaller than the smallest distance F776 : Table used by F71E. COntains a value which has meaning concerning the position between 2 objects. Indexed by the Y of F776. (Used by F71E) F796 : Table : direction bits to choose from with a pointer (build with results of F71E) for enemy going on Mega Man and circling over him. The pointer is build from information about the position between two objects. From this information is the value F71E return in A (value read from F776). (Used by F7A6) (Also used by FD17) (Also used by Manta) F7A6-F7D7 : Give information about the distance between Mega Man and the enemy... Appear to be a really useful function! Use by Wall Gun, enemies that make circle over Mega Man (like Lady Bug Copter), and maybe others... Will be really useful when we know more. Calls F6FD which load Mega Man's position datas, and then F71E to calculate values this function uses to make enemy go toward Mega Man and then circle over him. (Uses table F796) (Uses F6FD) F7D8-F842 : Hit detection: MM - Object Walls Return Value : Carry is set if Mega Man is on an object. Else, it's clear. $01 : contains ID of object hit. Important points : $F822 : It's where it comes when there is a collision with an object. F843-F899 : ?? F89A-F8BC : ? Return relative X coordinate between Megaman and object Y? (Sub of F7D8) Relative X coordinate is returned in memory $10. F8BD-F8F8 : I don't know what it does exactly, but has to do with calculating vertical distance with MM. This is this function which is used to calculate values which are used to put MM on/under object. (Sub of F7D8) F8F9 : ?? F92E : Subtract Y coordinate pixels from MM if in contact with wall object. F93F : Add Y coordinate pixels to MM if in contact with wall object. Return value : Carry Set : Carry Clear F95D-F9B3 : Hit detection : Megaman w/ Enemy Object. Variables it uses : Write Over : $00 That's all! (for Mega Man's shape, it's already set in the function. The value is the same for everything, except sliding, which is checked by sprite ID (#$10 = sliding)) [Return value: 01 in the Carry Flag if there is no collision] IMPORTANT NOTE : OBJECT NEED TO BE VISIBLE! (Bit 5 of Slot $0528,X) ALSO, THIS DOESN'T CHECK IF THERE IS AN OBJECT IN SLOT X! F9B4-F9F3 / 7F9C4-7FA03 : Hit detection : Megaman w/ Enemy Object - Shape Height (Y) Data Value is in # of Pixels from center of Object. (For total value, multiply by 2) F9F4-FA33 / 7FA04-7FA43 : Hit detection : Megaman w/ Enemy Object - Shape Width (X) Data Value is in # of Pixels from center of Object. (For total value, multiply by 2) Which entry is used in these two tables are referenced by the Object's shape bits. These are bits 2-7 of the object's byte in the $408-$41F memory range. That makes the byte pointer to both tables above. NOTE : This function checks the difference between center of Mega Man and Enemy Object. It compares the distance with the ones in the tables. FA34-FA81 /7FA44-7FA91 : Collition Detect : Weapons with Enemies [Arg: X = Enemy, Y = Weapon] [Return value: 01 in the Carry Flag if there is no collision] (Uses table FACE) FA82 : Particle Hit Detection Check? (00, 01, 02, E6, E7 <- input args. Returns by Carry : set if there is no collision.) FABE-FACD : Max Object Slot of weapons for each Weapon ID. Used with collition detection with enemies. (Table of FA34) FACE / 7FADE : Shape Height and Width Table (For Weapons) For this weapons table, each Shapes are ordered in pairs of Object Height (Y) then Width (X). Value is in # of Pixels from center of Object. Pointers (to have it, take the Substance and Shape of the weapon, and multiply by 2) 00 : Normal Shot, Drill Bomb 04 : Medium Pharaoh Shot 08 : Small Pharaoh Shot 0A : Fully charged Pharaoh Shot Note : For Enemy Shape Data, take their Substance and Shape value and make AND 3F. Then you have the pointer for table FADC and FB1C For more specific datas on Substance and Shape, such as which object used which, seek Substance and Shape Explicits values FADC : Shape Height Table - Enemies. Value is in # of Pixels from center of Object. (For total value, multiply by 2) FB0A : Gachappon's Entry FB1C : Shape Width Table - Enemies. Value is in # of Pixels from center of Object. (For total value, multiply by 2) FB4A : Gachappon's Entry FB5C-FB6B : Find Empty Enemy Object Slot (With X register, from $8 to $17) [Return vals: X = Obj slot] FB6C-FB7B : Find Empty Enemy Object Slot (With Y register, from $8 to $17) [Return vals: Y = Obj slot, Carry = Result, Set if no empty obj slot could be found.] FB7C-FB8B : Find Empty Object Slot (With Y register, from $5 to $17) FB8C-FC13 / 7FB9C-7FC23 : Throw weapon directly on Mega Man. Sets the direction bits and speed, so it goes on Mega Man with the same speed, in different direction. [Arg: X = object to orient index] [Ret val.: 0C = Direction bits of the object, so it goes on Mega Man. You have to set it, after the call, the function doesn't do it. It sets the speed though.] (Uses F6E6) FC14-FC39 : Divide routine [ Arguments: $00 = Argument 1, $01 = Argument 2 Return Values: $02 : Result of Argument 1 ($00) divided on Argument 2 ($01). $03 : Remainder of divide ] If divide by 0, Result 1 ($02) returns $FF, Result 2 ($03) returns value of Argument 2. FC3A-FC7A : 16-bit Divide Routine [Affects: $06, $07, $09 (Temp mem) Arguments: $00 : Argument 1 Low byte $01 : Argument 1 High byte $02 : Argument 2 Low byte $03 : Argument 2 High byte Return Values: $04 : 8-bit Remainder of divide? $05 : 8-bit Result (Argument 1 / Argument 2) ] FC7B-FC9D : Multiplication Routine - (Unused, not addressed from anywhere.) [ Affects: $04 (temp) Arguments: $00, $01 Return Values: $02 : 8-bit Result $03 : ?? Affected if result overflows byte value, but is not High byte of 16-bit result. ] FC9E-FCBE : Set disable flag in $100-$11F range for stage's enemy/item. [Hard-Wired Misc] Data: FCBF-FCC6 : Bit OR / AND table FCC7-FCCE : Bit OR / AND table (Inverted bits) ASM: FCCF-FCE2 : Remove Properties of Object in Slot indexed by Y Register. Those properties are, with Y index : $300, $450, $5A0, $5B8 and put #$FF in $438. FCE3-FD04 : Stores Banks, Calls $C421, $DB3A and $FF1C. called while refilling Weapon Energy/Health. FCE7 : JSR point from Wily Saucer Sequence (Bank $39, $9167) FD05-FD16 : Store Banks to stack, Call $DABB (Scroll Graphics Load Handler) FD17-FD44 : Subroutine used by Whale enemy's missile to set movement speed. Used by other enemies? FD45-FD74 : Data. FD45 : Low byte of speeds FD5D : High byte of speeds FD75-FD8D : Subtract Weapon Energy Routine FD8E-FD9B / 7FD9E-7FDAB : Weapon Energy Depletion for Each Weapon ID FD9C-FDCC : Init Boss Battle Music and set up other memory. - Called from Enemy ASM. Music played depends on stage. FDCD-FDDD : Pre-Intro ASM Launcher - Changes bank and calls Pre-Intro ASM. Called from Startup ASM. FDDE-FDE6 : Remove All Weapon/Gadget Objects (Removes Objects in Obj Slots 1-4.) FDE7-FDFF : Unused random data. [$FE00-$FFF9 Region] ASM: FE00-FEA4 : Boot-up asm from Reset Interrupt - Various Reseting / Initializing. Continues into FEA5. FEA5-FEEC : Multi-Thread Handler Loop. FEED-FEFC : Register Thread. Arguments: A = Thread Slot. (0-3) $93 = Start Address Low. $94 = Start Address High. FEFD-FF04 : Remove Thread (?). A register is Thread Slot. Unused Routine. FF05-FF0E : Remove Thread - ?? FF0F-FF14 : Return [$91] * 4 in X. JSR to FF11 : Return (A * 4) in X. FF15-FF1B : Multi-frame Delay : # of Frames in X. (Calls FF1C multiple times.) FF1C-FF36 : Thread Context Switch Call Stores Thread status and goes to multi-thread handler. (FEA5). After Vblank has occured, it returns back from the thread handler. Joypad Memory is automatically refreshed before it returns. This routine is called to do single-frame delay, among other things. FF37-FF5B : Bankswitch Routine [Usage: Set $F5 (Bank# $8000-$9FFF) or/and $F6 (Bank# $A000-$BFFF), then call this routine.] FF5C-FFAC : Sound Refresh - Call Sound Init / Play Routines. Called once every Vblank. FFAD-FFB2 : Initial CHR Bank Setup from Reset. FFB3-FFF9 : Unused random data. [Interrupt Vectors] FFFA-FFFB : NMI Vector FFFC-FFFD : Reset Vector FFFE-FFFF : IRQ Vector Level Data ========== A000-A3FF : 16x16 Tile Data A000-A0FF : Upper-Left 8x8 Tile A100-A1FF : Upper-Right 8x8 Tile A200-A2FF : Lower-Left 8x8 Tile A300-A3FF : Lower-Right 8x8 Tile Each 16x16 tile uses a byte in all 4 tables. A400-A4FF : 16x16 Tile - Palette and Substance Data (Single byte for each entry.) MSB bit0-bit3 : Substance ID bit6-bit7 : 4-color BG Palette LSB A500-A8FF : 32x32 Tile Data Unlike 16x16 tile data, each entry is organized in groups of 4 bytes. byte 1 : Upper-Left 16x16 Tile byte 2 : Upper-Right 16x16 Tile byte 3 : Lower-Left 16x16 Tile byte 4 : Lower-Right 16x16 Tile A900-B0FF : Screen Preset Data (Space for 32 Screen Presets) B100-B17F : Stage Sprite Objects - Screen of Location B180-B1FF : Stage Sprite Objects - X Coordinate of Location B200-B27F : Stage Sprite Objects - Y Coordinate of Location B280-B2FF : Stage Sprite Objects - Enemy ID B300-B32F : Stage Sprite Object Count for each Screen (Used for Mid-Points when setting enemy count back.) B330-B4FF : Unused. (Random data) B500-B52F : Screen Preset Order B520-B52F : Normally not used, but some levels are more than 32 screens long. (Pharaoh Man's stage.) B530-B53F : Scroll Data B540-B54F : Special Scroll Data (Groups of 4 bytes.) B550-B55F : Scroll Index : Stage BG Palette Set B560-B56F : Scroll Index : Scroll Graphics Load ID B570 : Boss Door Wrap Up - Nametable VRAM Address of Door Updates - High B571 : Boss Door Wrap Up - Nametable VRAM Address of Door Updates - Low (Note: This points to the bottom 16x16 Tile of the Door, the top left 8x8 tile of that one, to be exact.) B572-B575 : Boss Door Wrap Up - Which 16x16 Tiles to draw in place of the boss door. B576 : Boss Door Wrap Up - Attribute Table (Palette) Updates - 32x32 Tile of Door Updates (0 to $3F) B577 : Boss Door Wrap Up - Attribute Table (Palette) Updates - 16x16 Tile of Door Updates (0 to 3) (This also points to the bottom 16x16 Tile of the door.) B578-B57B : Boss Door Wrap Up - Attribute Table OR Data for each 16x16 Tile. B57C-B587 : Boss Door Wrap Down Data. (Should be similiar to wrap-up data) B590-B61B-> : Stage BG Palette Sets B61B is the maximum byte used in Megaman 4 for palette sets, but its safe to use data past that, until B6FF. B61C-B6FF : Unused. Tutorial for Sprite Banks ========================= To explain it, let's take the sprite 10 from Sprite Bank 3 (Ring Man's Ring) BEFORE ANIMATION You must first add this value (Sprite ID : 10) to both ROM address Animation - Address Table Low Animation - Address Table High of Sprite Bank 3, whiwh are 1FE10 (Low) and 1FF10 (High) to obtain the address of it's animaton You find at 1FE20 (Low) D1 and at 1FF20 (High) B5 which makes B5D1. This is the RAM address where is the Animation. Since we are looking for it in the ROM, you must add it to 14010 if it's in Sprite Bank 3, C010 if it's Sprite Bank 1, 10010 if it's Sprite Bank 2 and 64010 if it's Sprite Bank 4. Let's call those the "Adjust Values". Our pointer, in this case, is 1F5E1. We are now at the animation datas ANIMATION Byte 0 : The number of animation (00 being 1 animation... Also, if value is bigger or equal to 80, you'll have to add 100 to the Tile Usage pointers. Byte 1 : The delay between animations. Byte following : Tile Usage pointers, they are used to know where is the Tile Usage. To find your Tile Usage, you need to add the Tile Usage Pointers to the following datas Tile Usage - Address Table Low (1F810 for Sprite Bank 3) Tile Usage - Address Table High (1FA10 for Sprite Bank 3) and do the same process as done in the first step, with the same "Adjust Value". Let's do it with Tile Usage pointer 26. With 82 as High and F4 as Low, when adding it to 14010, you shall obtain 1C304. Let's go there. TILE USAGE Byte 0 : The number of tiles (00 being 1 tile) Byte 1 : The Coordinate Pointer (for all the tiles, coordinate will be applied with the same order as the tiles are given here). Byte followings : By groups of two : First : The tile to load from the Pattern Table (PPU viewer with emulator FCEUXD) Second: Byte composed of bits with signification. bit 7 : If set, make a Horizontal Flip of the Tile. bit 6 : If set, make a Vertical Flip of the Tile. bit 5 : If set, tile is behind background. bit 4 : Never seem to be use. If it has a use, it's unknown. bit 3 : Never seem to be use. If it has a use, it's unknown. bit 2 : Never seem to be use. If it has a use, it's unknown. bit 0 & 1 : Their value, as Hex, is used to know which palet to use to color this tile (from 0 to 3). They defined set of palets loaded in the RAM of the game. COORDINATE With the Coordinate Pointer of the Tile Usage (Byte 1), use those table Coordinate Data - Address Table Low (1FC10 for Sprite Bank 3) Coordinate Data - Address Table High (1FD10 for Sprite Bank 3) to obtain 996E with our current example, and add it to the "Adjust Value" of Sprite Bank 3, to obtain 1D97E. There, the datas are this way, by group of 2 (2 Byte for each tile). Apply the coordinate to the tiles with the same order they are shown. Byte 0 : Y position from the center of object. Byte 1 : X position from the center of object. NOTE : Coordinates from FF to 80 are negative, starting with -1 as FF. 00 to 7F are positives. Negative is left on X coordinates, and up on Y coordinates. That's about it! Coordinates pointers may be used by more than one Tile Usage. Especially paterns which are common, like squares. The only Tile Usage which are used for more than one animation are the Empty ones. Object ID List ============== Total number of Object ID's is $D0. Megaman 4 does not support more. "u" is noted for unused Id. 01 : Megaman. 02 : Buster Shots. 03 : Weapon Shots - After having been deflected off enemies. 04 : Rush Coil/Marine/Jet. 05 : Rain Flush 06 : Balloon Adaptor 07 : Dive Missile 08 : Ring Boomerang 09 : Drill Bomb 0A : Dust Crusher 0B : Wire Adaptor 0C : Pharaoh Shot (Shot) 0D : Pharaoh Shot (Being Charged) 0Eu: Unused. 0F : Skull Barrier 10 : Ladybug Copter (Enemy ID $00) 11 : Ladybug Copter - Dropped Propel. 12 : Hover (Enemy ID $01) 13 : Slinky (Enemy ID $02) 14 : Scorpion 15 : Scorpion - Controller/Generator (Enemy ID $03) 16 : Grasshopper (Enemy ID $04) 17u: Jet Bird - Unused. 18 : Jet Bird (Enemy ID $05) 19 : Jet Bird Children 1A : Wall Gun (Enemy ID $06/$07) 1B : Wall Gun's Bullet 1C : Lightbulb Guy (Enemy ID $10) 1D : Lightbulb Guy - Flare Capsule 1E : Lightbulb Guy - Flare 1F : Rat (Enemy ID $11) 20 : Ring Man Rainbow Bar A/2A (Enemy ID $8/$C) 21 : Ring Man Rainbow Bar B/2B (Enemy ID $9/$D) 22 : Ring Man Rainbow Bar C/2C (Enemy ID $A/$E) 23 : Ring Man Rainbow Bar D/2D (Enemy ID $B/$F) 24 : Hippo's nose (Enemy ID $18) 25 : Hippo's Missile 26 : Hippo - platform block (Enemy ID $1A) 27 : Handler when Wily battle finished in Wily Stage 3. 28 : Wall (Enemy ID $29/$2A/$2B) 29 : Handler after Cossack Stage 1 & 2 Boss defeated. / And Wily Stage 1 & 2 Boss defeated. (Changed to $29 from previous ID.) 2A : Energy Circling around Megaman after Boss defeated. 2B : Snailbot (Toad Man stage miniboss) (Enemy ID $1E) 2C : Snailbot's Bomb 2D : Snaibot - Defeat Handler 2E : Fragments of Defeated Boss. 2F : Bright Man Stage Platform - Red (Enemy ID $28) 30 : Ring Miniboss (Enemy ID $12) 31 : Ring Miniboss - Ring seperation handler 32 : Ring Miniboss - rings (seperated body) 33 : Fly (Enemy ID $13) 34 : Fly's Dropped Bullet 35 : Umbrella Metool (Enemy ID $14) 36 : Umbrella Metool - Umbrella Projectile 37 : Fireworks Guy (Enemy ID $15) 38 : Fireworks Guy - Fireworks Capsule 39 : Hover : Bullets shot 3A : Ring Miniboss - Defeat handler 3B : Drill Bomb - Explosion State (Set to $3B from $09.) (Also used with Cossack stage 1 boss) 3C : Explosion(s).. (Set to when Ring Miniboss is defeated). (Also when Snailbot is defeated) 3D : Spinner (Enemy ID $2D) 3E : Super ball machine (Enemy ID $3E/$3F) 3F : Super ball machine - Balls 40 : Falling Rock - controller (Enemy ID $30) 41 : Falling Rock - smaller pieces 42 : Eddie (walking) (Enemy ID $31) 43 : Eddie (not walking) (Enemy ID $32) 44 : Eddie - Item given by Eddie (Not $C1) 45 : Cossack stage 3 boss (Cockroach Twins) (Enemy ID $1C) 46 : Jumbig (Enemy ID $33) 47u: Unused. - ASM at $9F85 in bank $3A, already used by something else. 48 : Shield Attacker (Enemy ID $34) 49 : Cossack stage 3 boss - Handler - Initialize 2nd Cockroach Twin 4A : Cossack stage 3 boss - Handler - Cockroach twins defeated 4B : Hippo - Used when defeated 4C : Lightbulb Guy - After shot - Takes care of initializing auto palette fade down 4D : Wily Stage 4 Battle - Swirls, Enemy ID $1D (Enemy ID $1D is never used however) 4E : Totempole (Enemy ID $36) 4F : Totempole's Bullet 50 : Walking Metool (Enemy ID $3B) 51 : Metool's Bullets 52 : Whale miniboss (Enemy ID $38) 53 : Whale's Missile 54 : Whale's Mines 55u: Unused. - RTS at $ACFC in bank $3D. 56 : Jumping Metool (Enemy ID $3C) 57u: Unused. (Enemy ID $3D) - Bank $3D, $AD0C. 58u: Unused. (Enemy ID $3E) - Bank $3D, $AD0C. 59u: Unused. (Enemy ID $3F) - Bank $3D, $AD0C. 5Au: Unused. (Enemy ID $40) - Bank $3D, $AD0C. 5B : Drill Man's stage Switch (Enemy ID $41) 5C : Spinning Metool (Enemy ID $42) 5D : Cossack stage 3 platforms (Enemy ID $6A) 5E : Dust Man up/down ceiling handler 5F : M422A (Enemy ID $45) 60 : Block Platform (Enemy ID $80), Shuffled Block, General (Used as general Object ID at ending, credits, and during intro scenes.) (Sprite Bank $A/$B) 61 : Amoeba (Enemy ID $47) 62 : Skeleton Joe (Enemy ID $48) 63 : Skeleton Joe - Bone 64 : Saturn Bot (Enemy ID $49) 65 : Water Metool (Enemy ID $4A) 66 : Water Air Bubbles. 67 : Used with Wily Stage 1 Boss - ASM pointer refers to RTS ($8824) (Enemy ID $2C, $6D) 68u: Unused. 69 : Skullmet (Enemy ID $46/$4B) 6A : Skullmet's Bullet 6B : Dive Man's stage - Wavering water effect 1 (Enemy ID $16) 6C : Dive Man's stage - Wavering water effect 2 (Enemy ID $17) 6D : Helipon (Enemy ID $4C) 6E : Helipon's Bullet 6F : Water Splash 70 : Piranha (Enemy ID $4D) 71 : Skull Man 72 : Skull Man's Bullets 73 : Assembling Block (Enemy ID $4F) 74 : Assembling Block - 16x16 pixel blocks. 75 : Ring Man 76 : Ring Man's Ring Boomerangs 77 : Explosion? (Handler after Robot Master defeated) 78 : Wall Wheel (Enemy ID $51/$52) 79 : Dust Man 7A : Dust Man's Dust Crusher (Big) 7B : Dust Man's Dust Crusher (Smal) 7C : Dive Man 7D : Dive Man's Dive Missile 7E : Drill Man 7F : Drill Man's Drill Bomb 80 : General - (Object ASM $8823). Known to be used to make the small explosion when an enemy dies, only when enemy dies with the "Kill Enemy Procedure" 81 : Skull Man's Skull Barrier / General Id (Robot Master Credits - Robot Master sprites) (Sprite Bank $E/$F) 82 : Used in Drill Man Boss Battle. 83 : Multiple Explosions 84 : Pharaoh Man 85 : Pharaoh Man - Pharaoh Shot 86 : Pharaoh Man - Normal shots 87 : Cossack stage 1 boss (Enemy ID $57) 88 : Cossack stage 1 boss - rod (Enemy ID $58) 89 : Cossack stage 1 boss - eyes (Enemy ID $59) 8A : Cossack stage 1 boss - bullet 8B : Bright Man 8C : Bright Man's Bullets 8D : Toad Man 8E : Battonton (Enemy ID $5C) 8F : Cossack stage 1 boss - debris 90 : Triggered after Whale miniboss. (Bank: 3D, Addr: A5D3) 91 : Mantan (Enemy ID $5D) 92 : Cossack battle - Cossack sprite (Enemy ID $5E) 93 : Cossack battle - cranes (Enemy ID $5F) 94 : ??? (Only movement) (Bank: 3D, Addr: BA8B) 95 : Cossack stage 2 boss - eye (Enemy ID $61) 96 : Cossack stage 2 boss - platforms (Enemy ID $62) 97 : ??? (Only movement) (Bank: 3D, Addr: BA8B) 98 : Falling Rock - Rock falling down 99 : Cossack stage 2 boss - walls (Enemy ID's $63-$66) 9A : Mummy Mauler (Enemy ID $67) 9B : Mummy Mauler - Thrown Head 9C : Worm (Enemy ID $68) 9D : Pickups dropped by enemies / explosion after Enemy is killed. 9E : Cossack Stage 3 Boss (Enemy ID $69) 9F : Cossack Stage 3 Boss - Heavy Shot A0 : Cossack Stage 3 Boss - Bullets A1 : Mono-Roader (Enemy ID $6B) A2 : Cossack Stage 3 Boss (Cockroach Twin #2) A3 : Cossack Defeated Scene - Kalinka A4 : Cossack Defeated Scene - Protoman A5 : Cossack Defeated Scene - Dr.Wily A6 : Wily Stage 1 Boss - eyes (Enemy ID $6C) A7 : Gachappon (Enemy ID $6E) A8 : Gachappon's Fast Bullets A9 : Gachappon's Bomb AA : Wily Stage 1 Boss - Metools. AB : Wily Stage 2 Boss - Controller AC : Wily Stage 2 Boss - Boss Substance (Enemy ID $1B) AD : Wily Stage 2 Boss - Ball AE : Wily Stage 2 Boss - Flame shot AF : Wily Stage 2 Boss - Platforms B0 : Pakatto 24 (Enemy ID $72) B1 : Pakatto 24's Bullets B2 : Upndown B3 : Warp (Enemy ID $74) B4 : Upndown - Controller (Enemy ID $73) B5 : Spike Block (Enemy ID $75 and $76) B6 : Water Mine (Enemy ID $77) B7 : Spark Spine (Enemy ID $78) B8 : Robot Master Boss Controller (Enemy ID $79) B9 : Skull Dropper (Enemy ID $4E) BA : Moving Skull (Generated by Skull Dropper) BB : Wily Stage 3 Battle (Enemy ID $50) - Points to 8824. BC : Wily Stage 3 Battle (Enemy ID $53) BD : Spike Box from Right - Controller (Enemy ID $54) BE : Spike Box BF : Wily Stage 3 Battle - Shots C0 : Wily Stage 3 Battle - Second form - Something! C1 : General pickup controller (E-Tank, Health and Weapon Energy Capsules) (Note: Not items dropped by enemies) C2 : Balloon Item and Wire Item Capsules C3 : Wily stage 1 Shuffled blocks (Enemy ID $35) C4 : Wily Stage 4 Battle C5 : Wily Stage 4 Battle - Charged Shot C6 : Big Energy Capsule dropped by robot masters in rematch battles. C7 : Ladder Press Right (Enemy ID $84) C8 : Fireworks Guy - Object placed when shot, splits into fireworks and smal explosion. C9 : Bright Man Stage Platform - Green (Enemy ID $82) CA : Ladder Press Left (Enemy ID $81) CB : Wily Stage 4 - Wily Sprite CC : Drill Man Boss Battle - Clouds when Drill Man drills into/out of ground. CD : Snailbot (Toad Man stage miniboss) - top (Enemy ID $1F) CE : Spike Box from Left - Controller (Enemy ID $85) CF : Dive Man stage floating spikes Sprite ID List ============== An "u" after the ID means that the listed Sprite ID is unused for that bank. "?" means im not sure if its really unused or not. Sprite Bank 1 (MMC3 Banks $A/$B) Sprite ID's: --------------------------------------------- 01 : Intro : Fourth Screen (MM on train) - Face 1 (Sad mouth) 02 : Intro : Fourth Screen (MM on train) - Face 2 (Normal mouth) 03 : Intro : Fourth Screen (MM on train) - Face 3 (Determined face) 04 : Intro : Fourth Screen (MM on train) - Face 4 (Putting helmet) 05 : Intro : Fourth Screen (MM on train) - Body 1 (Standing) 06 : Intro : Fourth Screen (MM on train) - Body 2 (Lifting fist) 07 : Intro : Second Screen (MM in Machine) - Body (Pelvis region) 08 : Intro : Second Screen (MM in Machine) - Face 2 (Pain animation) 09 : Intro : Third Screen (MM waking up) - Face 2 (Opening eyes) 0A : Intro : First Screen (City) - Explosion 1 0B : Intro : First Screen (City) - Explosion 2 0C : Intro : First Screen (City) - Explosion 3 0D : Intro : Fourth Screen (MM on train) - Tunnel lights 0E : Wheeled Skull (front) 0F : Wheeled Skull (moving) 10 : Skull Dropper 1B : ??? 1C : Spike Box 1D : ??? 33 : Intro : Second Screen (MM in Machine) - Face 1 (Normal) 34 : Intro : Third Screen (MM waking up) - Face 1 (Eyes closed) 35 : Intro : Fourth Screen (MM on train) - Face 5 (Helmet on) 36 : Intro : Fourth Screen (MM on train) - Body 3 (Fist raised) 37 : Intro : Third Screen (MM waking up) - Face 3 (Eyes opened) 38 : Intro : Second Screen (MM in Machine) - Face 3 (Eyes closed) 39 : First of unused pointers Sprite Bank 2 (MMC3 Banks $C/$D) Sprite ID's: --------------------------------------------- 01 : MM - Standing 02 : MM - Aiming 03 : MM - Unleashing object 04 : MM - Walking 05 : MM - Aiming while walking 06 : MM - Unleashing object (looks same as 03, use unknown) 07 : MM - Jumping 08 : MM - Aiming while jumping 09 : MM - Unleashing object while jumping 0A : MM - Climing ladder 0B : MM - Aiming while climbing ladder 0C : MM - Unleashing object while climbing ladder 0D : MM - Step forward 0E : MM - Aiming (same as 02, use unknown) 0F : MM - Unleashing object (same as 03, use unknown) 10 : MM - Sliding 11 : MM - Getting hit (with explosion) 12 : "Clouds" when MM gets hit. 13 : MM - Warp animation 14 : MM - Reaching top of ladder 15 : MM - Aiming while climbing ladder (same as 0B, used if shooting when "reaching top of ladder") 16 : MM - Unleashing object while climbing ladder (same as 0C, used if shooting when "reaching top of ladder") 17 : Slide dust cloud 18 : Normal Buster Shot 19u: Big Explosion 1Au: Big Health Capsule 1Bu: Smal Health Capsule 1Cu: Big Weapon Capsule 1Du: Smal Weapon Capsule 1Eu: E-Tank 1Fu: Extra Life 20 : Full Charged Shot - Release Form 21 : Smal Charged Shot 22 : Full Charged Shot - Deflected off enemy 23 : Full Charged Shot 24 : Rush Jet 25 : Rush Coil 26 : Rush Marine (Not in operation) 27 : Rush Marine (Combining with Megaman) 28u: Rush Marine (Without waves behind propel - unused.) 29 : Rush Marine (In operation) 2A : Rush Marine (Aiming buster) 2B : Rush Marine (Getting hit) 2Du: Water splash - same data as 2E. 2E : Water splash 32 : MM - Warp animation (same as 13, use unknown) 33 : "Ready" 35 : Medium Explosion 36 : Rain Flush capsule 37 : Rain Flush capsule B 3E : Balloon Item 3F : Balloon Item (Megaman On Top) 40-44 : Dive Missile 40 : Up 41 : Up-Left/Right 42 : Left/Right 43 : Down-Left/Right 44 : Down 45 : Ring Boomerang 46 : Drill Bomb 47 : Pharaoh Shot A (small) 48 : Pharaoh Shot B (half charged) 49 : Pharaoh Shot C (charged) 4A : Dust Crusher 4B : Dush Crusher, small piece 4C : Dush Crusher, small piece 4D : Dush Crusher, small piece 4E : Dush Crusher, small piece 4F : Charging Pharaoh Shot 50 : Skull Barrier 51 : Wire Item Capsule 52 : Balloon Item Capsule 53-60u : ? Has its own data. 64-6Bu : Same data as $6C. 6E : Cossack Battle - Cossack Catcher "cranes" 71 : Dr.Wily (After Cossack battle) 72?: Dr.Wily - Talking, pointing finger (unused?) 74 : Kalinka 75?: Kalinka - Talking (unused) 76 : Dr. Cossack (After battle) 77?: Dr. Cossack - Talking (unused) 78 : Warping (Dr.Wily and Protoman after Cossack battle) 79 : Protoman 7A : Cossack Sprite (Battling Megaman) 83 : Cossack Battle - Cossack Catcher lamps. 89 : Wily's Saucer flying into distance 8A : Wily's Saucer flying 8B : Wily's Saucer - Opening Up (Top) 8C : Wily'S Saucer - Opening Up (Bottom) AA : MAY BE THE FIRST OF UNUSED POINTERS B0-FFu: Unused, has no pointers. Sprite Bank 3 (MMC3 Banks $E/$F) Sprite ID's: --------------------------------------------- Sprite ID range: 00-6F 01-06 : Skull Man Sprites 01 : Skull Man's Skull Barrier 02 : Skull Man standing 03 : Skull Man Walking 04 : Skull Man creating Skull Barrier 05 : Skull Man Shooting 06 : Skull Man Jumping 07 : Mothraya Eyes 08 : Bullet - Used with Skull Man and Bright Man and other bosses. 09-11 : Ring Man Sprites (Except 0E) 09 : Ring Man Standing 0A : Ring Man Walking 0B : Ring Man Walking, Throwing Ring 0C : Ring Man Jumping/Falling 0D : Ring Man Throwing Ring in Air 0F : Ring Man's sparkling helmet 10 : Ring Man's Ring 11 : Ring Throwing 0E : Mothraya : The light flashing on his red button 12-1C : Dust Man Sprites (Except 16) 12 : Standing 13 : Preparing Dust Crusher 14 : Jumping Up 15 : Preparing for sucking attack 17 : Dust Crusher (Composed) 18 : Dust Crusher (Smal piece) 19 : Dust Crusher (Smal piece 2) 1A : Dust Crusher (Smal piece 3) 1B : Dust Crusher (Smal piece 4) 1C : Doing sucking attack 16 : Mothraya (Cossack Stage 1 Boss) Rod 1D-28 (excluded 25 & 27) : Dive Man Sprites 1D : Shooting Dive Missile 1E : Propelling through - Preparing 1F : Dive missile Left/Right 20 : Dive missile Up 21 : Dive missile Down 22 : Dive missile Down Left/Right 23 : Dive missile Up Left/Right 24 : Standing. 25 : Unused. Points at same data of 26. 26 : Propelling through 27 : Unused : against Mothraya, it's a sprite for fire from his back. However, he doesn't use it. 28 : Tilting forward 29-33 (excluded 32) : Drill Man Sprites 29 : Standing 2A : Standing, facing screen 2B : Drill into ground - Dust Cloud 2C : Standing, facing screen - Rotating drills 2D : Fast Jumping up 2E : Drilling into ground 2F : Jumping 30 : Running 31 : Shooting 33 : Drill Man's Drill Bomb. 32 : Bullet shot by Mothraya and second Cockroach Twin. 34-35 & 37 & 38 : Bright Man Sprites 34 : Standing 35 : Jumping 37 : Doing Flash 38 : Aiming 36 : Rush Animation sprite in Weapon Get 39-40 : Pharaoh Man Sprites 39 : Standing 3A : Charging Pharaoh Shot 3B : Jumping (facing Left) 3C : Jumping, throwing smal shot (facing Left) 3D : Jumping (facing Right) 3E : Jumping, throwing smal shot (facing Right) 3F : Pharaoh Shot 40 : Smal Pharaoh Shot 41-43 : Toad Man Sprites 41 : Toad Man Standing 42 : Toad Man Jumping 43 : Toad Man Rain Dance 44 : Boss Demo - Bright Man 45 : Boss Demo - Toad Man 46 : Boss Demo - Drill Man 47 : Boss Demo - Pharaoh Man 48 : Boss Demo - Ring Man 49 : Boss Demo - Dust Man 4A : Boss Demo - Dive Man 4B : Boss Demo - Skull Man 4C : Mothraya - Debris 1 when breaking floor 4D : Mothraya - Debris 2 when breaking floor 4E : Mothraya - Debris 3 when breaking floor 4F : Mothraya - Debris 4 when breaking floor 50-5F : Cossack Stage 3 boss (Cockroach twins) sprites 50 : Walking (bottom wall) 51 : Wall turn - bottom wall to left wall 52 : Walking (left wall) 53 : Wall turn - left wall to top wall 54 : Walking (top wall) 55 : Wall turn - top wall to right wall 56 : Walking (right wall) 57 : Wall turn - right wall to bottom wall 58 : Aiming (at bottom wall) 59 : Aiming/Ducking (at bottom wall) 5A : Aiming (at left wall) 5B : Aiming/Ducking (at left wall) 5C : Aiming (at top wall) 5D : Aiming/Ducking (at top wall) 5E : Aiming (at right wall) 5F : Aiming/Ducking (at right wall) 60 : Gachappon 61 : Gachappon (Launching ball from top) 62 : Gachappon (Shooting bullet) 63 : Gachappon's Ball 64 : Mantan (Wide) 65 : Mantan (Narrow) 66 : Mantan (Smal) 67 : Mono-Roader (Normal) 68 : Mono-Roader (Rotating) 69 : Battonton (Hiding) 6A : Battonton (Starting to move) 6B : Battonton (Flying) 6C : Battonton (Going back to hiding) 6D : Sinking Platform. 6E : Toad Man Sprite (Use unknown) 70 : First of Unused Pointers Sprite Bank 4 (MMC3 Banks $36/$37) Sprite ID's: ----------------------------------------------- Sprite ID's / Animation Address Table Index: 01 : Ladybug Copter (Flying) 02 : Ladybug Copter (Circling) 03 : Ladybug Copter (Circling - slower) 04 : Ladybug Copter (Propel) 05 : Hover (MM not on) 06 : Hover (MM on) 07 : Hover (Air clouds) 08 : Hover (Same as 06?) 09 : Spinner (Onto ceiling) 0A : Spinner (Ready to spin) 0B : Spinner (Spinning) 0C : Hippo (Nose) 0D : Hippo (Ears) 0Eu: Unused 1 (Smal sprite) (Correction - Might be Hippo's Missile) 0Fu: Unused 2 (Some 16x16 animated sprite) (Correction - Might be Hippo's Missile) 11u: Unused 3 (Some 16x16 animated sprite) (Correction - Might be Hippo's Missile) 12u: Unused 4 (Smal sprite) (Correction - Might be Hippo's Missile) 13 : Slinky (One block down) 14 : Scorpion (Walking) 15 : Scorpion (Digging down into ground) 16u: Unused ID in this bank, Same data as $17. 18 : General Bullet? 19 : Explosion 1A : Big Health Capsule 1B : Smal Health Capsule 1C : Big Weapon Capsule 1D : Smal Weapon Capsule 1E : Extra Life 1F : E Tank 20u: Unused ID in this bank, Same data as $21. 21 : Small Wall 22u: Unused 5 (Could be Enemy ID $2A's sprite.. or a copy of it.) 23u: Unused 6 (Could be Enemy ID $2B's sprite.. or a copy of it.) 24u: Unused 7 (Some animated block.. uses enemy sprite tiles.) 25u: Unused 8 (Some small un-animated sprite..) 26u: Unused 9 (Unused sprite: Rolling ball-something!) 27u: Unused 10 (Unused enemy sprite: Snake!) 28u: Unused 11 (Some animated block.. also uses enemy sprite tiles.) 29 : Rainbow Bar 2A : Rainbow Bar (2nd Variant) 2B : Fireworks Guy (Walking) 2C : Fireworks Guy (Jumping) 2Du: Unused ID in this bank, Same data as $2E. 2F : Jet Bird 30 : Jet Bird (Same as 2F?) 31 : Jet Bird Child (Forward) 32 : Jet Bird Child (Down) 33 : Jet Bird Child (Forward-Down) 34?: Unused? 12 - Jet Bird Child (Up) 35?: Unused? 13 - Jet Bird Child (Forward-Up) 36 : Snailbot's Eyes 37 : Snailbot - "Thing" on the back. 38 : Snailbot - Launch opening on top. 39?: Unused 14? (Snailbot's Bomb) 3A : Wall Gun - Direction 1 3B : Wall Gun - Direction 1 (Aiming) 3C : Wall Gun - Direction 2 3D : Wall Gun - Direction 2 (Aiming) 3E : Wall Gun - Direction 3 3F : Wall Gun - Direction 3 (Aiming) 40 : Wall Gun - Direction 4 41 : Wall Gun - Direction 4 (Aiming) 42 : Wall Gun - Direction 5 43 : Wall Gun - Direction 5 (Aiming) 44 : Wall Gun - Direction 6 45 : Wall Gun - Direction 6 (Aiming) 46 : Wall Gun - Direction 7 47 : Wall Gun - Direction 7 (Aiming) 48 : Sand Clounds when Scorpion digs into ground? 49 : Fireworks Bot - Launched Fireworks 4A : Fireworks Bot - Exploding Fireworks 4B : Rainbow Bar? 4C : Lightbulb Bot 4D : Lightbulb Bot (Launching flares?) 4E : Lightbulb Bot (?) 4F : Lightbulb Bot - Flare Capsule 50 : Lightbulb Bot - Flare 51 : Rat 52 : Ring Guy 53 : Ring Guy (Eyes only) 54 : Ring Guy (Seperating into rings) 55 : Ring Guy (Ring) 56 : Fly 57 : Fly's Bullet 58 : Eddie (Standing) 59 : Eddie (Throwing item) 5A : Eddie (Walking) 5B : Hippo (Warp Animation)? 5C : Umbrella Metool/Bot (Walking) 5D : Umbrella Metool/Bot (Folding umbrella) 5E?: Unused 21? (Umbrella Metool/Bot - walking forward with umbrella) 5F : Umbrella Metool/Bot (Walking forward without umbrella) 60 : Umbrella Metool/Bot (Launching umbrella) 61 : Umbrella Metool/Bot - Umbrella 62 : Explosion 63 : Grasshopper (Hopping) 64 : Super Ball Machine 65 : Super Ball Machine (Ball - Vertically stretched) 66 : Super Ball Machine (Ball - Horizontally stretched) 67 : Falling Boulder (Compact) 68 : Falling Boulder (Smal piece 1) 69 : Falling Boulder (Smal piece 2) 6A : Falling Boulder (Smal piece 3) 6B : Falling Boulder (Smal piece 4) 6E-70u: Unused 22 (same data) (Might be a platform) 71 : Drill Man Stage Switch 72 : Skullmet 73 : Skullmet (Shooting bullet) 74 : Shield Attacker (seems unused, same as 76) 75 : Shield Attacker (seems unused, same as 76) 76 : Shield Attacker 77 : Shield Attacker (Turning) 78u: Unused 23 (Unused enemy sprite: Wheel gun!) 7E : Air Bubble 90 : Amoeba standing 91 : Amoeba going down 92 : Amoeba "walking" 93 : Amoeba going up 97 : Saturn Bot A0u: Unused 25 (Unused enemy sprite: Drop) A1u: Unused 26 (Unused enemy sprite: Drop - falling drop) AAu: Unused 27 (Some animated 32x32 pixel block using mirrored sprites) AD : First of unused pointers B0-FFu: Unused, has no pointers. More Sprite ID's: (Undetermined Sprite Bank) -------------------------------------------- 49 : Fireworks A 4A : Fireworks B 62 : Explosion (drill bomb) DF? : Inviliciblity blink Unused IDs.. ============ Definately Unused Enemy ID's: $21, $22, $23, $24, $25, (more) Other Unused Enemy ID's: 2A : Wall (Medium) 2B : Wall (Large) 2C : Loads Object ID $67, Sprite ID $A0. (Sprite Bank 2) 3D : Switch (Unused Variant) 3E : Loads Unused Object ID $58, Sprite ID $71 (Sprite Bank 4) 3F : 40 : 88-8F : Unused entries. 8F is the last entry in all the tables concerning Enemy ID. Unused Object ID's: 0E 17 : Unused ASM - Generates Jet Bird (Object ID $18) 47 : ASM at $9F85 in bank $3A, already used by something else. - Generates explosions w/ sound. 55 : RTS at $ACFC in bank $3D. 57 : ASM at $AD0C in bank $3D, already used by Drill Man Stage Switch. (Object ID $5B.) 58 : ASM at $AD0C in bank $3D, already used by Drill Man Stage Switch. (Object ID $5B.) 59 : ASM at $AD0C in bank $3D, already used by Drill Man Stage Switch. (Object ID $5B.) 5A : ASM at $AD0C in bank $3D, already used by Drill Man Stage Switch. (Object ID $5B.) 68. Weapon Shape ID's ================= 00 : 00x00 : Normal Buster, Small Charged Buster, Drill Bomb, Ring Boomerang, Dust Crusher, Dive Missile, Wire 01 : 02x06 : Fully Charged Buster 02 : 06x06 : Medium Pharaoh Shot 03 : 0Ex0E : Drill Bomb Explosion 04 : 02x02 : Small Pharaoh Shot 05 : 0Ax0A : Big Pharaoh Shot 06 : 16x16 : Skull Barrier NOTE : To read the datas from FACE, multiply the pointers by two (since one pointer covers two datas) Object Shape ID's - bits 2-7 of 408-41F (Occupying area, hit detection between sprites). ======================================================================================== ( Height x Width ) $FADC x $FB1C 00 : 0A-0A - 16*16 Square - Ladybug Copter, Battonton, Big Energy Capsule. 01 : 09-0A - Ring Man Rainbow bars (active) 02 : 0A-12 - Ring Man Rainbow bars (inactive) 1, Ring Guy Sub-object 03 : 0A-1A - Ring Man Rainbow bars (inactive) 2 04 : 0A-22 - Ring Man Rainbow bars (inactive) 3 05 : 0A-2A - Ring Man Rainbow bars (inactive) 4 06 : 0A-32 - Ring Man Rainbow bars (inactive) 5 07 : 0A-3A - Ring Man Rainbow bars (inactive) 6 08 : 0A-42 09 : 0A-4A 0A : 06-1A 0B : 08-12 0C : 0A-1A 0D : 0E-0E - Mono-Roader, Ring Guy (Piece) 0E : 06-06 - Hippo's Missile 0F : 05-05 - Ladybug Copter - Dropped Propel, Bullets. 10 : 0E-12 - Wall Gun 11 : 0E-0A - Helipon 12 : 0A-06 13 : 1A-12 - Jumbig, Ring Guy 14 : 12-12 - Drill Man's Drill Bomb Explosion 15 : 12-0A 16 : 1A-0A 17 : 22-0A 18 : 22-32 - Hippo 19 : 2A-32 1A : 06-0A 1B : 0C-0E 1C : 10-05 1D : 04-0E 1E : 0B-0E 1F : 32-12 20 : 07-0A - Metools (Covered) 21 : 04-0A 22 : 0E-1A 23 : 1A-0C-Bright Man? 24 : 12-0C 25 : 42-06 26 : 12-32 27 : 12-06 28 : 0E-06 29 : 2A-0A 2A : 0A-42 2B : 05-0E 2C : 22-22 2D : 16-2A 2E : 22-16 2F : 32-32 30 : 32-22 31 : 0A-16 32 : 12-16 33 : 7A-12 - 34 : 0A-08 35 : 82-F2 36 : 0D-0B - Drill Man 37 : 1A-1A 38 : 0C-0A 39 : 0A-0C 3A : 02-02 (unused) 3B : 02-02 (unused) 3C : 02-02 (unused) 3D : 02-02 (unused) 3E : 02-02 (unused) 3F : 02-02 (unused) (Went through Drill Man/ on Ring Man..) Wall hit detection ID - Vertical ================================ Object - Vertical Wall Detection ID (For D2FC/F0F8) =================================================== Pairs: [Down]/[Up] Note 1 : Down/Up, meaning if the movement of the object is going down, or up. Different numbers are used for both case. 00/01 : Megaman (Normal) D71E/D722 02 : Megaman - Check if in Water. Used in function $F3C1 (bank $3E). After the check with $1A/1B, Rush Marine call $D2FC with this pointer. D727 03 : Megaman - Slide - Check open space above MM D72A 04 : Megaman - Slide - Check open space below MM D72F 06 : Worm (Falling Down), Spinner (On Ground) 08/09 : Skull Man (Jumping), Fireworks Bot, Mono-Roader, Wheel Skull 0A/0B : Some Robot Masters (Jumping), Umbrella Bot Falling, Grasshopper Jump Robot Masters : Dive Man, Pharaoh Man, Toad Man 0C/0D : Dust Man (Jumping), Rat's Jump, Falling Boulder (Big) 0E : Eddie, Spark Spine, Item dropped by Eddie (Down), Spinner 10 : Megaman - Toad Man Stage - Check for hit with Block types Glide Right/Left, Special 11/12 : Snail Bot's Bomb 13 : Bright Man Jump, Hover 14 : Small (8x8) Item (Downwards gravity) 15 : Rush Warp Down, Falling Boulder (small pieces) 16/17 : Super Ball Machine's Ball 18/19 : Rush Jet, a pointer checking collision when moving. 18 : Worm (When on ground) 1A/1B : Rush Marine 1C/1D : Totempole 1D/1E : Metool 1F/20 : M442A (Down/Up) 21/22 : Amoeba 23 : Wire, Water Bubbles (Up) 26/27 : Water Metool 29 : Helipon (Down Check) 2A : Wall Wheel (Down check) 2B : Wall Wheel (Up check) 2C : Unused? 2D : Big (16x16) Item 32/33 : Jumbig 38 : Megaman - Another check if in Water? (Used to determine when to generate bubbles.) 39 : Megaman - Slide Stop - Check open space below MM, but at #$10 instead of #$0A like pointer $04. It's used when stop sliding. Maybe because of moving floors? D800 3A : Battonton - Upwards wall check 3B-3F : Unused. Wall hit detection ID - Horizontal (For D428/F3ED) ================================================== Pairs: [Right]/[Left] Note 1 : Right/Left, meaning if the movement of the object is going right or left. Different numbers are used for both case. Exemple : 00 is Mega Man (Normal) collision to the Right 01 is Mega Man (Normal) collision to the Left It checks at specific points if there is a collision. I will explain it with an example of pointer 00 02 08 F8 08 0B 02 : First digit always tell the number of digits there will be after second digits. Here 3 because it's #$02 08 : Second digit tells us, from center of object, how much to move the point to check. Here, +8 (#$08) Here, those are all excedent digits, for which collisions are checked. The number of those is said by the first digit. Those are all Y values moving from the point we are, to know where to check for collision. I will go on with the example. Note : If going Up, for #$FC, Y position will be AND #$04... so knowing this you can find the rest F8 : Go up from where you are of -8 (#$F8) and check at this point for collision. IMPORTANT NOTE! FOR ALL THE FOLLOWING DIGITS, WE ALWAYS MOVE FROM THE LAST POSITION 08 : Go down from where you are (-8) of 8. So check at 0 vertical position 0B : Go down from where you are (0) of 0B : So check vertical position at B. That's all! 00/01 : Megaman (Normal) D888/D88D 04/05 : Mega Man (Slide) D897/D89B 06/07 : Mega Man (To Start to Slide) D89F/D8A2 0C/0D : Dive Man D74D/D752 0E/0F : Drill Bomb, Worm (Small) D8BF/D8C3 14/15 : Rat, Flying Shield, Dust Man, Skull Man, Fireworks Bot, Scorpions, Hover, Mono-Roader 18/19 : Umbrella Bot Walking, Spark Spine, Item dropped by Eddie 1A/1B : Snail Bot's Bomb 1C/1D : Piranha, Spinner 20/21 : Super Ball Machine's Ball 22/23 : Eddie 24/25 : Rush Jet, Worm (Medium) 26/27 : Rush Marine 2A/2B : Metool 2E/2F : Water Metool 30/31 : Wall Wheels 32/33 : Toad Man, Pharaoh Man 34/35 : Bright Man 36/37 : Worm (Large) 3C/3D : Jumbig 3E : Megaman - ??? (Normal) I know it is set here, and not called in stage #$04... has to do with Ring man rainbow bars? D998 3F : Megaman - ??? (Slide) D99C Toad|Dust|Skull|Dive|Bright|Pharaoh Object Slot Usage ================= 00: Megaman. 01-04: Megaman's Weapons. 04 : Rush Coil or Wire Adaptor Stuff 05: Water when MM walks. (In Toad Man's stage.) "Shock" sprite when MM is hit by enemy Slide dust cloud. Water Splash. Might be used at explosions (When MM dies, and other cases). 06: Megaman's Air Bubbles (If Megaman is in Water.) Might be used at explosions (When MM dies, and other cases). 07: Might be used at explosions (When MM dies, and other cases). 08-17 : Enemies, Items, Explosions, etc. Stage Bank / Scene Bank (Contents of $22) ========================================= 00: Bright Man 01: Toad Man 02: Drill Man 03: Pharaoh Man 04: Ring Man 05: Dust Man 06: Dive Man 07: Skull Man 08: Cossack Stage 1 09: Cossack Stage 2 0A: Cossack Stage 3 0B: Cossack Stage 4 0C: Wily Stage 1 0D: Wily Stage 2 0E: Wily Stage 3 0F: Wily Stage 4 Scanline Effect ID's (Contents of $F0) ====================================== 00: No effect 01: Hippo 02: Whale 03: Mothraya 04: Dust Man Ceiling 05: Dive Man Waves 06: Dr. Cossack Battle 07: Dr. Cossack Stage 2 Boss 08: Dr. Cossack Battle End Scene 09: Giant Metool Battle and Wily Stage 3 Battle 0A: Train Ride Intro and Ending Scene 0B: Weapon ID's (Refers to what is loaded into Memory $A0) ====================================================== 00: Mega Buster 01: Rush Coil 02: Rush Jet 03: Rush Marine 04: Rain Flush 05: Wire Adaptor 06: Balloon Adaptor 07: Dive Missile 08: Ring Boomerang 09: Drill Bomb 0A: Dust Crusher 0B: Pharaoh Shot 0C: Flash Stopper 0D: Skull Barrier Sprite Tile Usage ================= Enemy sprites: C0-CF : Ladybug Copter (Enemy ID $00) C0-CF : Hover (Enemy ID $01) A0-BF : Slinky (Enemy ID $02) A0-BF & D2-D6 : Desert Scorpion (Enemy ID $03) E0-FF : Grashopper (Enemy ID $04) DC-EF : Rocket Bird (Enemy ID $05) E0-FF : Gun (Enemy ID $06/$07) A0-BA : Lightbulb Guy (Enemy ID $10) A0-BF : Sewer Rat (Enemy ID $11) E0-EF : Fly (Enemy ID $13) A0-DB : Umbrella Guard (Enemy ID $14) C0-DF : Fireworks Guy (Enemy ID $15) E0-EF : Bright Man Platforms (Enemy ID $28, $82) EE-EF : Walls (Enemy ID $29/$2A/$2B) C0-E6 : Blade Spinner (Enemy ID $2D) A0-BF : Super Ball Machine (Enemy ID $2E/$2F) B0-BF : Falling Boulder (Enemy ID $30) B0-BF & D0-F4 Jumbig (Enemy ID $33) C0-DA : Shield Attacker (Enemy ID $34) A0-AF : Shuffled Blocks (Enemy ID $35) C0-DF : Totempole (Enemy ID $36) A0-AF & B0-B2 & D0-DF : Walking Metool (Enemy ID $3B) A0-BF : Jumping Metool (Enemy ID $3C) A0-AF : Switch (Enemy ID $41/$3D) A0-AF & B0-B2 & C0-CF : Spinning Metool (Enemy ID $42) A0-AF : M442A (Enemy ID $45) C0-D8 : Skullmet (Enemy ID $46/4B) C0-E6 : Amoeba (Enemy ID $47) A0-EF : Skeleton Joe (Enemy ID $48) C0-CF : Saturn Bot (Enemy ID $49) D0-EF : Water Metool (Enemy ID $4A) C0-EF : Helipon (Enemy ID $4C) B8-BB & C0-CF : Piranha (Enemy ID $4D) C0-DF : Skull Dropper (Enemy ID $4E) A0-AB : Assembling Block (Enemy ID $4F) A0-A5 : Wheel (Enemy ID $51/$52) F0-FF : Spike Box (Enemy ID $54) A0-BF : Battonton (Enemy ID $5C) D0-EF : Mantan (Enemy ID $5D) A0-BF & D0-FF : Mummy Mauler (Enemy ID $67) A0-AF & E0-E9 : Worm (Enemy ID $68) D0-DF : Sinking Platform (Enemy ID $6A) D0-FF : Mono-Roader (Enemy ID $6B) B0-BF & D0-FF : Gachappon (Enemy ID $6E) C0-CF : Pakatto 24 (Enemy ID $72) F0-FF : Upndown (Enemy ID $73) A0-AD : Shifting Spike Block (Enemy ID $75/$76) C0-CB : Water Mine (Enemy ID $77) B0-B7 : Spark Spine (Enemy ID $78) A0-B5 : Ladder Press (Enemy ID $81/84) Effects: F0-FF : Water Splash Effect / Bubbles Primary Graphics Load ID list ============================= 00-0F : Stage Graphics Load (Starting from beginning of stage) 10 : Stage Select / Capcom Logo 11 : Title Screen 12 : Debug Menu - Font Load (Unused otherwise) 13 : Debug Menu - Sprite Revert (Unused otherwise) 14 : Weapon Menu 15 : Weapon Menu Exit - Sprite Graphics Revert (Megaman's sprites) 16 : Weapon Get 17 : Password 18-1F : Boss Demonstration Graphics 20-2F : Weapon Menu - Graphics Reload for each stage (Not used at continue point!) 30-3D : Weapon Graphics (Sorted by Weapon ID) Note: 30 and 3C points to the same data! Modifying one will modify the other. 3E : Cossack Stage Intro 3F : Dr. Wily Stage Intro 40 : Wily Saucer Scene 41 : - 42 : Bright Man's Stage - Continue Point 1 43 : Drill Man's Stage - Continue Point 1 44 : Pharaoh Man's Stage - Continue Point 1 45 : Ring Man's Stage - Continue Point 1 46 : Dust Man's Stage - Continue Point 1 47 : Dive Man's Stage - Continue Point 1 48 : Skull Man's Stage - Continue Point 1 49 : Ring Man's Stage - Continue Point 2 4E : Cossack Stage 1 - Continue Point 1 4F : Cossack Stage 2 - Continue Point 1 50 : Cossack Stage 3 - Continue Point 1 51 : Cossack Stage 4 - Continue Point 1 52 : Wily Stage 1 - Continue Point 1 53 : Wily Stage 2 - Continue Point 1 54 : Toad Man's Stage - Continue Point 1 55 : Copyright Text / Intro - City Scene 56 : Intro - Megaman's History 57 : Intro - Train Ride Scroll Graphics Load ID list ============================ 00 : Nothing 01 : Hippo 02 : Ring Man BG graphics change, Saturn Bot, Rainbow Bars 03 : 04 : Mummy Mauler 05 : Snailbot BG and SPR 3A : Unused Sound ID list ============= ID BGM SFX 00: X Bright Man 01: X Toad Man 02: X Ring Man 03: X Drill Man 04: X Pharaoh Man 05: X Dive Man 06: X Skull Man 07: X Dust Man 08: X Cossack Stage 1 & 2 09: X Wily Stage 1 & 2 0A: X Pre-Intro A 0B: X Ending 0C: X Stage Clear 0D: X Password 0E: X Game Over 0F: X Stage Intro 10: X Stage Select 11: X Boss Battle 12: X Title 13: X Credits 14: X Weapon Get 15: X Cossack Stage 3 & 4 16: X Wily Stage 3 & 4 17: X Flash Stopper 18: X Rain Flush 19: X Ring Boomerang 1A: X Drill Bomb 1B: X Pharaoh Shot (Load) 1C: X Lightning (Cossack Stage Intro) 1D: X Path being drawn (Cossack/Wily stage maps) 1E: X Charged Shot Release 1F: X Extra Life 20: X Unused? - Mega Buster charged? 21: X Normal Buster Shot 22: X Mega Buster load start 23: X MM hits ground 24: X MM hit by enemy 25: X MM explodes 26: X Buster shot on enemy 27: X Mega Buster loaded (held) 28: X Drill Bomb Explodes (and more?) 29: X Health being filled up 2A: X Selection selected. 2B: X MM's weapon deflected off enemy 2C: X Boss-door wrap-up 2D: X ?? Password error? 2E: X Menu selection 2F: X Password OK? 30: X Opening Weapon Menu 31: X Grasshopper's Jump. 32: X Wire 33: X MM appears. 34: X Unused - Train Flute? 35: X ? 36: X Wily's lab is going to explode 37: X Wily's lab is exploding (?) 38: X Unused - ? 39: X Appearing/Disapperaing Blocks 3A: X Balloon/Wire Adaptor Achieved. 3B: X Wily Stage Intro 3C: X Cossack Stage Intro 3D: X Full-loaded mega buster released. 3E: X Full-loaded Pharaoh Shot released. 3F: X Protoman's Whistle 40: X Wily Saucer 41: X MM Warps Out 42: X Unused - Train Car SFX? 43: X Pre-Intro B 44: Unused (Pointer is 0, no data.) 45: X Final Wily Battle 46: X Wily Defeated Game Sequence ============= +-- Wily Defeated ->>-- JSR --> Ending/Credits **END** | +- Cossack Stage Map +-- Robot M. Defeated >-- JSR -+- Weapon Get -+ | | Weapon Menu | | | | | | | (stage already V | | | | clear, no Weapon Get) V ^ V | | | | ^ V | | +------<<<-----+ | RTS <> | | | V | | | | +->>+>+ Start Level -> [Game Loop] ----+--- Loose Life --------+ | | | ^ ^ V | | | | | +-----------<<<<---------------------------+ | V | ^ | | V | ^ +---<<<-- RTS ---<<<--- (continue) ----+ V V | | ^ V | | | ^ | | | +-- RTS -<<+ +------ JMP --------<- Game Over -<<- JSR -<<--+ | | | V | +----- Stage Select --<>-- Robot Master Demonstration | | ^ | ^ | | ^ | | | +--------<<<-------- Password Screen ------<<<----------+ | +--<-+ | | | | ^ Password Enter | | | ^ +----+ | Copyright/ Title Screen ---<>-- Intro | +-- JSR ---+ | ^ | Reset ($FE00) **START** Hard-wired bank ($7C010-$8000F): * Reset * Start Level * [Game Loop] Additional Messy Notes ====================== Object/Wall Hit Detection - Object Shape Data (Vertical Hit Detection) ---------------------------------------------------------------------- BYTE # of components. BYTE Y add. BYTE X add. for each additional component: BYTE X add Sprite Data Formats ------------------- Animation Data: Size of Data - Description 1 byte [# of Frames + Page Flag] 1 byte Frame Length (In Vblank's) [# of Frames]+1 Tile Usage ID's Tile Usage Data: Size of Data - Description 1 byte [# of Tiles] 1 byte Coordinate ID 2 * ([# of Tiles]+1) Tile Block Tile Block: 1 byte Pattern Table Tile 1 byte Sprite Attribute Byte Weapon Code Procedure --------------------- Weapon Handler: (Tmp Memory $10/$11 seems to be used for Temps) $10: Direction Operand Function $11: Sprite ID? (Quit if Weapon Energy = Empty) Check for B Button Push ($14/$16, AND #$40) Release New Object: ( lda $16 and #3 beq :+ sta $420 sta $31 jsr $F4F6 (dunno what it does) : Setting MM's Pose: Setting $32 (Pose Length) If $33 is 0: { Setting $33 Calling $F446 (X = 0), with $33 + $558(0) } Set 420> Call $F49C (with args) Set 300> to something. Set up 3A8>, 3C0>, 3D8>, 3F0> Ranges (Object Speeds?) Set up 408> (unknown use) to 04? Call $FD75 to subtract current weapon's energy Call $F6BE with Sound ID in A for whatever weapon sound effect Common Object ASM for Weapons/Items: jsr $F413 ;(Object Slot in X register) - update horizontal Object movement (left and right) jsr $F434 ;(Object Slot in X register) - update vertical Object movement (up and down) jsr $884B ;(Object Slot in X register) - make weapon work with "Shootable" block type. lda $390,x ;$390 is Y screen. beq :+ ;Will remove object if it moves out of top or bottom of screen. jsr $DC00 ;(Object Slot in X register) - Kill object. Explosion Code Procedure ------------------------ This is for a explosion that hurt Mega Man !!! START : HOW TO CREATE AN EXPLOSION (LIKE WITH DRILL MAN'S BOMB) 20 00 DC JSR $DC00 Kill object !!! Load the sprite ID for explosion and call function to set it and reset sprite's properties A9 62 LDA #$62 20 46 F4 JSR $F446 !!! Object ID now become #$83, multiple explosion A9 83 LDA #$83 9D 00 03 STA $0300,X @ $0313 = #$2C !!! Substance and shape now become #$B7 A9 B7 LDA #$B7 9D 08 04 STA $0408,X @ $041B = #$CE 60 RTS !!! END : HOW TO CREATE AN EXPLOSION (LIKE WITH DRILL MAN'S BOMB) Kill Enemy Procedure -------------------- This is useful, because just calling $DC00 doesn't put the small explosion sprite. This is what is used in the original ASM when an enemy dies after a time. A function to put a enemy exploding sprite when you kill him !!! Kill enemy $9EF3:20 00 DC JSR $DC00 !!! Put a object ID of explosion. $9EF6:A9 9D LDA #$9D $9EF8:9D 00 03 STA $0300,X @ $0317 = #$CE !!! Set Substance And Shape to #$00, else it deflects weapons $9EFB:A9 00 LDA #$00 $9EFD:9D 08 04 STA $0408,X @ $041F = #$C0 !!! Load the sprite for the small explosion. $9F00:A9 62 LDA #$62 $9F02:4C 46 F4 JMP $F446 ASM explanation : Bank $3C, $805E : Crushed by a moving wall? ------------------------------------------------------------- $805E:A5 30 LDA $0030 $8060:C9 06 CMP #$06 $8062:B0 32 BCS $8096 $8064:A5 22 LDA $0022 $8066:C9 04 CMP #$04 $8068:F0 2C BEQ $8096 $806A:A2 00 LDX #$00 $806C:A0 3E LDY #$3E $806E:A9 B5 LDA #$B5 $8070:85 00 STA $0000 $8072:A5 30 LDA $0030 $8074:C9 02 CMP #$02 $8076:D0 05 BNE $807D $8078:A9 B7 LDA #$B7 $807A:85 00 STA $0000 $807C:C8 INY $807D:A5 F0 LDA $00F0 $807F:C9 04 CMP #$04 $8081:D0 07 BNE $808A $8083:AD 78 03 LDA $0378 $8086:C5 00 CMP $0000 $8088:B0 0C BCS $8096 $808A:20 28 D4 JSR $D428 $808D:A5 10 LDA $0010 $808F:29 10 AND #$10 $8091:F0 03 BEQ $8096 $8093:20 43 82 JSR $8243 $8096:60 RTS This ASM is for detecting if megaman became crushed by a moving wall, and happens every frame during all gameplay, except for Ring Man's stage. $22 is stage id, the value #$04 means Ring Man's stage. Its probably only meant for the moving wall in Dust Man's stage. The reason for the Ring Man exception is probably to prevent the disappearing bars from crushing megaman, they are moving walls. There is also additional code for when megaman is in the moving wall section in Dust Man's stage. If MM's Y coordinate is $B5 or more ($B7 if sliding), the wall hit detection is skipped. Im not sure why. (F0 is active Scanline Effect id, #$04 is the one used in the moving wall section. This value is checked a lot of places to check if MM is in that particular area of the game.) Graphics Load Data ------------------ 0: Source Bank 1: # of tiles 2: Src Hi 3: Dst Hi Earlier Version Traces ---------------------- Suggestion: Cossack Stage 3 were meant to have the Sewer Rat enemy and Platforms from Bright Man's stage at the beginning of the stage. Evidence: The graphics for those objects are loaded into the pattern table when the stage starts. Suggestion: Toad Man's stage had a section where scrolling splits in two, connected at the screen right before the first Snail miniboss. Maybe either Wire or Balloon were in Toad Man's stage previously. Evidence: Between screens $F and $12 in Toad Man's stage, there are two blank screens, which follows regular scroll data. The "ordinary" path between screens $F and $12 is connected using extraordinary scroll data. (ie Multi-Path data). Alternate "READY" tiles: A different-looking tile set of "ready" is loaded into the sprite pattern table, among the "lightbulb" enemy graphics when Bright Man's stage starts. These might be test graphics, or Capcom thought of using a different part of the pattern table for the "READY" tiles. ROM Version / Regional differences (Incomplete) ----------------------------------------------- European version: Bank $1B ($36010) has some differences in code. The sound engine has alot of changes. (Bank $1E) Rockman version: Bank $1C ($38010) has a few changes in code. Bank $1B ($36010) has some differences in code. Bank $3D: Changes from $B690 / $7B6A0 and on. $CF52 / 7CF62 : STA $BF and STA $4C8 is swapped around. Differences between Rockman 4 ROM dumps (differences from "Rockman 4 - Aratanaru Yabou! (J).nes".) Rockman 4 - Aratanaru Yabou! (J) [a1].nes : Tile at $8B90: 1 pixel is different (probably corrupt). Tile at $269E0: 1 pixel is corrupt. Tile at $2DD10: 1 pixel is corrupt. Tile at $2EC50: 1 pixel is corrupt. Tile at $306A0: 1 pixel is corrupt. Tile at $33330: 1 pixel is corrupt. Tile at $4BF90: 1 pixel is corrupt. Rockman 4 - Aratanaru Yabou! (J) [b1].nes : NES header: Initial Mirroring setting is Horizontal. Tile at $E020: Slightly different. Basically, for most ranges labeled "Unused random data", the contents of those ranges seem all different in both the European version and the Rockman 4 version.